nmgwddj 发表于 2013-7-12 13:43:01

Au3多线程的难点是不是CreateThread中的函数指针了?

看了P版的列子,http://www.autoitx.com/forum.php?mod=viewthread&tid=18106&highlight=%B6%E0%CF%DF%B3%CC
个人感觉au3使用多线程唯一的难点就是第三个参数传递函数指针这里了。看P版的代码是直接汇编代码往内存里面写数据。如果是一个au3写出来的函数,地址该如何取?

gyc990326 发表于 2013-7-12 14:14:35

你可以自己用DllCallbackRegister建一个回调函数,再用DllCallbackGetptr即可。论坛有,在搜索中搜多线程示例

gyc990326 发表于 2013-7-12 14:17:35

网址在这里http://www.autoitx.com/forum.php?mod=viewthread&tid=21303&highlight=%B6%E0%CF%DF%B3%CC%CA%BE%C0%FD记得善用搜索功能

gyc990326 发表于 2013-7-12 14:20:43

之所以不推荐使用回调函数,是因为要解决资源占用的问题,否则程序就会很不稳定。我现在正在解决这个问题

pusofalse 发表于 2013-7-12 16:45:41

又说到多线程了,前段时间也在想这个问题。猜想,只要调用LoadLibrary将解析器重新加载一遍,将解析器AutoIt3.exe的入口点当做是线程函数来执行,那么AU3就能曲线实现多线程,但这样做无法解决重定位问题,只能借助反汇编工具,挨个查找AutoIt3.exe中的全局变量。如果将AutoIt3.exe的源代码重新编译为一份DLL,那么重定位问题也解决了。
看以后能否集ACN众坛友之力,将AU3转为一门编译型语言。有人负责AU3代码的词法解析,有人负责将其翻译成机器码。

nmgwddj 发表于 2013-7-12 16:54:35

回复 4# gyc990326

回复 5# pusofalse


    感谢4楼朋友的热心,自己注册的回调函数真的是太纠结了。说实话我还真没有成功使用au3真正实现一进程多线程的情况。
    P版想法大胆,大家一起努力相信会有成果。

最近论坛访问速度太慢了,都不知道怎么了。。。

gyc990326 发表于 2013-7-12 20:54:45

回复 6# nmgwddj


    是可以的
我在这里试验成功了,可是总是出现内存溢出

gyc990326 发表于 2013-7-12 20:58:47

回复 5# pusofalse


    其实我也是会反编译的,最近看看我能不能学一下软件逆向,用IDA把代码还原出来

gyc990326 发表于 2013-7-12 21:02:02

回复 5# pusofalse


    还有,多线程要解决资源占用的问题,我这边看来得用互斥体。要不P版编一个线程锁UDF

pusofalse 发表于 2013-7-13 17:48:22

回复 9# gyc990326


我不知该如何编写这样一个UDF。如果是用AU3代码来写的话,会出现许多莫名其妙的错误,无力解决。如果是用其他语言来写的话,我还没弄清AutoIt3.exe在细节方面的原理。gyc990326兄的研究成果如果能发布在论坛上,那将是所有AU3爱好者的幸事,我给加分~

gyc990326 发表于 2013-7-13 19:59:53

回复 10# pusofalse


    你看得出来我是多么的小啊,学疏才浅,才14岁
还有autoit在多线程的时候我这里也总出现内存错误,而且互斥体也根本没有效果!
恳请P版指教!

pusofalse 发表于 2013-7-13 20:07:44

回复 11# gyc990326


    厉害~ 以前我在某个论坛待久了,那里的人不论年龄大小,总以“兄”相称,深受那里影响,至今改不过口来了。
关于多线程,如果将CreateThread的第三个参数设为AU3自定义函数,这样做我从未测试成功过,5#的发言只是我想当然的猜想,没测试。

gyc990326 发表于 2013-7-13 20:18:48

回复 12# pusofalse


    可以的,你忘了论坛的一个多线程示例了?你还输让座者把msgbox改成consolewrite了

gyc990326 发表于 2013-7-13 20:21:57

回复 12# pusofalse


    还有,为甚么几乎每次退出都会出现此类错误??

---------------------------
autoit3.exe - 应用程序错误
---------------------------
"0x0042d68c" 指令引用的 "0x00000008" 内存。该内存不能为 "read"。


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------

nmgwddj 发表于 2013-7-14 13:00:21

回复 14# gyc990326


    先不说报错的问题吧,你上面的例子如果没有一个msgbox来控制线程的创建,(多核心或多线程CPU)运行下下面的例子看以下会出什么情况。
    缺少线程间的同步,没有办法控制线程切换。。。

Global $hThread = DllCallbackRegister("_ThreadProc", "DWORD", "ptr")
Global $i = 1

While $i < 10
        ;MsgBox(0, "Main", "press Ok To Start " & $i & " Thread!")
        DllCall("Kernel32.dll", "HANDLE", "CreateThread", "ptr", 0, "ptr", 0, "ptr", DllCallbackGetPtr($hThread), "DWORD", 0, "ptr", 0, "DWORD_PTR", 0)
       
WEnd
Sleep(10000)

Func _ThreadProc($Param)
        $i += 1
        MsgBox(0, "", "Hello! now $i =" & $i)
EndFunc   ;==>_ThreadProc
页: [1]
查看完整版本: Au3多线程的难点是不是CreateThread中的函数指针了?