找回密码
 加入
搜索
查看: 12295|回复: 22

[AU3基础] AU3多线程示例

 火.. [复制链接]
发表于 2011-1-19 17:45:17 | 显示全部楼层 |阅读模式
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

Func _ThreadProc($Param)
        $i += 1
        MsgBox(0, "", "Hello! now $i =  " & $i)
EndFunc
发表于 2011-1-19 18:18:40 | 显示全部楼层
你把MsgBox去掉,改成ConsoleWrite,或者再在线程函数里加个While循环、Sleep(100)之类的语句,看下发生什么问题。
 楼主| 发表于 2011-1-19 19:13:41 | 显示全部楼层
呃,的确有问题。似乎AU3的对象无法重入。
发表于 2011-1-19 19:29:11 | 显示全部楼层
不是很懂多线程,但知道用起来比较快.希望有人详解.
发表于 2011-1-19 20:19:06 | 显示全部楼层
回复 2# pusofalse

非线程安全的原因么?应该是一次只能运行一个线程?

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

While 1
        Sleep(20)
WEnd

Func _ThreadProc($Param)
                Local $Nowtemp =$i
        $i += 1
                MsgBox(0, "", "Hello! now $i =  " & $i)
                While 1
                        Sleep(1000)
                        ConsoleWrite($Nowtemp &" :--"& @SEC&@CRLF)
                WEnd
EndFunc
发表于 2011-1-20 00:56:59 | 显示全部楼层
我还没有看到au3真的支持多线程的。

这使得au3实现复杂功能时,就可能会出现若一个功能正在运行,就不能用另外的功能的现象。
发表于 2011-1-20 01:37:05 | 显示全部楼层
发表于 2011-1-20 05:22:04 | 显示全部楼层
厉害
7#的连接运行后
看到 108 个线程数
发表于 2011-1-20 06:04:35 | 显示全部楼层
本帖最后由 happytc 于 2011-1-20 06:10 编辑

回复 7# pusofalse

这些都是调用别的dll来做的,也就是au3只是売而已。并不是au3本身有这个功能。
这样做虽然可以曲线达到目的,但局限性太大了,若在dll里找不到自己需要的函数,就抓虾了!

若au3能象winapi里(C里)那样直接创建象下面这样的多线程,就爽死了
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );
发表于 2011-1-20 08:26:11 | 显示全部楼层
本帖最后由 pusofalse 于 2011-1-20 08:27 编辑

au3只是売而已,并不是au3本身有这个功能?不能因为没有封装成内置函数而说它没有这个功能啊,既然AutoIt提供了DllCall函数,那它就有这个功能。c中的CreateThread函数,难道是封装到编译器内部的?不也得在包含文件中声明一下系统库和函数原型吗,这个跟AutoIt的#include有何区别?在AutoIt中,#include相关的库文件之后,同样可以像MsgBox函数那样 直接传参数调用,而不必像在DllCall中那样,写明参数的类型,在这一点上,AutoIt跟c根本毫无区别。

还是说,happytc兄说的局限在于,AutoIt中的线程函数不能是自定义AutoIt函数(?),而只能是自定义的机器码函数?

PS: Kernel32.dll不算“别的dll”,少了这个链接库,不管什么程序都将运行不起来。
发表于 2011-1-20 08:48:33 | 显示全部楼层
回复 10# pusofalse

意思是用au3当写程序时,需要某个功能,找不到在DLL里有相应的函数有这个功能时,你怎么办呢?

也就是象我上面说的,不能象C里那样直接HANDLE CreateThread()来创建一个线程出来。
你仔细看看它的实现方式,根本不可能封装成象C里的HANDLE CreateThread()这种功能的au3函数来
当然,现在的条件下,这种曲线方式也不错了!
发表于 2011-1-20 11:30:43 | 显示全部楼层
脚本语言不能多线程?
能的.如:perl,python等就自带多线程函数,而且跨平台.
au3不能多线程?
也是能的,不过要走曲线救国路线.如shellcode.
但是shellcode要求你必须要懂得汇编,嗯嗯.懂了汇编,神马都是浮云.^_^
发表于 2011-1-20 12:12:10 | 显示全部楼层
AU3本质上与其他脚本并无区别,正如MsgBox() or InetGet()已经调用了多线程。
但AU3在设计之初并没有考虑线程的问题,很多函数的设计违背了线程的思想,以至于作者没有能力更改(应该说没有money没有动力),所以就变成今天的模样。
 楼主| 发表于 2011-1-20 13:32:36 | 显示全部楼层
au3编译,是伪编译吗?我看速度那么快,感觉像是伪编译。如果是的话,不支持多线程也不奇怪了
发表于 2011-1-20 17:32:56 | 显示全部楼层
没学过C,不知它怎么实现的。系统自带的Dll有几百个,里面的函数总共有几万个,根本不可能找不到,找不到也并不代表没有这样的功能,像那个SkinCrafterDll.dll皮肤dll,虽然操作系统没有直接给出设置皮肤的函数,但SkinCrafterDll.dll最终还不是调用了微软的绘图函数?积累的多了,自然就能找到。自不必说 自己写的话麻烦至极,应该把精力放在程序的编写效率上面什么的。已经把最底层的函数给你了,那么所有位于其高层的功能都可以实现。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 21:54 , Processed in 0.083425 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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