找回密码
 加入
搜索
查看: 9819|回复: 14

[系统综合] Au3多线程的难点是不是CreateThread中的函数指针了?

  [复制链接]
发表于 2013-7-12 13:43:01 | 显示全部楼层 |阅读模式
看了P版的列子,http://www.autoitx.com/forum.php ... =%B6%E0%CF%DF%B3%CC
个人感觉au3使用多线程唯一的难点就是第三个参数传递函数指针这里了。看P版的代码是直接汇编代码往内存里面写数据。如果是一个au3写出来的函数,地址该如何取?
发表于 2013-7-12 14:14:35 | 显示全部楼层
你可以自己用DllCallbackRegister建一个回调函数,再用DllCallbackGetptr即可。论坛有,在搜索中搜多线程示例
发表于 2013-7-12 14:17:35 | 显示全部楼层
网址在这里http://www.autoitx.com/forum.php ... F%B3%CC%CA%BE%C0%FD记得善用搜索功能
发表于 2013-7-12 14:20:43 | 显示全部楼层
之所以不推荐使用回调函数,是因为要解决资源占用的问题,否则程序就会很不稳定。我现在正在解决这个问题
发表于 2013-7-12 16:45:41 | 显示全部楼层
又说到多线程了,前段时间也在想这个问题。猜想,只要调用LoadLibrary将解析器重新加载一遍,将解析器AutoIt3.exe的入口点当做是线程函数来执行,那么AU3就能曲线实现多线程,但这样做无法解决重定位问题,只能借助反汇编工具,挨个查找AutoIt3.exe中的全局变量。如果将AutoIt3.exe的源代码重新编译为一份DLL,那么重定位问题也解决了。
看以后能否集ACN众坛友之力,将AU3转为一门编译型语言。有人负责AU3代码的词法解析,有人负责将其翻译成机器码。

评分

参与人数 2金钱 +90 贡献 +5 收起 理由
tryhi + 40
zldfsz + 50 + 5 希望P版及众坛友能完成这项重大的工程

查看全部评分

 楼主| 发表于 2013-7-12 16:54:35 | 显示全部楼层
回复 4# gyc990326

回复 5# pusofalse


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

最近论坛访问速度太慢了,都不知道怎么了。。。
发表于 2013-7-12 20:54:45 | 显示全部楼层
回复 6# nmgwddj


    是可以的
我在这里试验成功了,可是总是出现内存溢出
发表于 2013-7-12 20:58:47 | 显示全部楼层
回复 5# pusofalse


    其实我也是会反编译的,最近看看我能不能学一下软件逆向,用IDA把代码还原出来
发表于 2013-7-12 21:02:02 | 显示全部楼层
回复 5# pusofalse


    还有,多线程要解决资源占用的问题,我这边看来得用互斥体。要不P版编一个线程锁UDF
发表于 2013-7-13 17:48:22 | 显示全部楼层
回复 9# gyc990326


我不知该如何编写这样一个UDF。如果是用AU3代码来写的话,会出现许多莫名其妙的错误,无力解决。如果是用其他语言来写的话,我还没弄清AutoIt3.exe在细节方面的原理。gyc990326兄的研究成果如果能发布在论坛上,那将是所有AU3爱好者的幸事,我给加分~
发表于 2013-7-13 19:59:53 | 显示全部楼层
回复 10# pusofalse


    你看得出来我是多么的小啊,学疏才浅,才14岁
还有autoit在多线程的时候我这里也总出现内存错误,而且互斥体也根本没有效果!
恳请P版指教!
发表于 2013-7-13 20:07:44 | 显示全部楼层
回复 11# gyc990326


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


    可以的,你忘了论坛的一个多线程示例了?你还输让座者把msgbox改成consolewrite了
发表于 2013-7-13 20:21:57 | 显示全部楼层
回复 12# pusofalse


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

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


要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------
 楼主| 发表于 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
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 11:46 , Processed in 0.085066 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表