Au3多线程的难点是不是CreateThread中的函数指针了?
看了P版的列子,http://www.autoitx.com/forum.php?mod=viewthread&tid=18106&highlight=%B6%E0%CF%DF%B3%CC个人感觉au3使用多线程唯一的难点就是第三个参数传递函数指针这里了。看P版的代码是直接汇编代码往内存里面写数据。如果是一个au3写出来的函数,地址该如何取? 你可以自己用DllCallbackRegister建一个回调函数,再用DllCallbackGetptr即可。论坛有,在搜索中搜多线程示例 网址在这里http://www.autoitx.com/forum.php?mod=viewthread&tid=21303&highlight=%B6%E0%CF%DF%B3%CC%CA%BE%C0%FD记得善用搜索功能 之所以不推荐使用回调函数,是因为要解决资源占用的问题,否则程序就会很不稳定。我现在正在解决这个问题 又说到多线程了,前段时间也在想这个问题。猜想,只要调用LoadLibrary将解析器重新加载一遍,将解析器AutoIt3.exe的入口点当做是线程函数来执行,那么AU3就能曲线实现多线程,但这样做无法解决重定位问题,只能借助反汇编工具,挨个查找AutoIt3.exe中的全局变量。如果将AutoIt3.exe的源代码重新编译为一份DLL,那么重定位问题也解决了。
看以后能否集ACN众坛友之力,将AU3转为一门编译型语言。有人负责AU3代码的词法解析,有人负责将其翻译成机器码。 回复 4# gyc990326
回复 5# pusofalse
感谢4楼朋友的热心,自己注册的回调函数真的是太纠结了。说实话我还真没有成功使用au3真正实现一进程多线程的情况。
P版想法大胆,大家一起努力相信会有成果。
最近论坛访问速度太慢了,都不知道怎么了。。。 回复 6# nmgwddj
是可以的
我在这里试验成功了,可是总是出现内存溢出 回复 5# pusofalse
其实我也是会反编译的,最近看看我能不能学一下软件逆向,用IDA把代码还原出来 回复 5# pusofalse
还有,多线程要解决资源占用的问题,我这边看来得用互斥体。要不P版编一个线程锁UDF 回复 9# gyc990326
我不知该如何编写这样一个UDF。如果是用AU3代码来写的话,会出现许多莫名其妙的错误,无力解决。如果是用其他语言来写的话,我还没弄清AutoIt3.exe在细节方面的原理。gyc990326兄的研究成果如果能发布在论坛上,那将是所有AU3爱好者的幸事,我给加分~ 回复 10# pusofalse
你看得出来我是多么的小啊,学疏才浅,才14岁
还有autoit在多线程的时候我这里也总出现内存错误,而且互斥体也根本没有效果!
恳请P版指教! 回复 11# gyc990326
厉害~ 以前我在某个论坛待久了,那里的人不论年龄大小,总以“兄”相称,深受那里影响,至今改不过口来了。
关于多线程,如果将CreateThread的第三个参数设为AU3自定义函数,这样做我从未测试成功过,5#的发言只是我想当然的猜想,没测试。 回复 12# pusofalse
可以的,你忘了论坛的一个多线程示例了?你还输让座者把msgbox改成consolewrite了 回复 12# pusofalse
还有,为甚么几乎每次退出都会出现此类错误??
---------------------------
autoit3.exe - 应用程序错误
---------------------------
"0x0042d68c" 指令引用的 "0x00000008" 内存。该内存不能为 "read"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
--------------------------- 回复 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]