AU3多线程示例
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 你把MsgBox去掉,改成ConsoleWrite,或者再在线程函数里加个While循环、Sleep(100)之类的语句,看下发生什么问题。 呃,的确有问题。似乎AU3的对象无法重入。{:face (382):} 不是很懂多线程,但知道用起来比较快.希望有人详解. 回复 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 我还没有看到au3真的支持多线程的。
这使得au3实现复杂功能时,就可能会出现若一个功能正在运行,就不能用另外的功能的现象。 回复 6# happytc
au3真正的多线程PING
纯AU3 多线程群ping,只需1秒 厉害
7#的连接运行后
看到 108 个线程数 本帖最后由 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 ); 本帖最后由 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”,少了这个链接库,不管什么程序都将运行不起来。 回复 10# pusofalse
意思是用au3当写程序时,需要某个功能,找不到在DLL里有相应的函数有这个功能时,你怎么办呢?
也就是象我上面说的,不能象C里那样直接HANDLE CreateThread()来创建一个线程出来。
你仔细看看它的实现方式,根本不可能封装成象C里的HANDLE CreateThread()这种功能的au3函数来
当然,现在的条件下,这种曲线方式也不错了! 脚本语言不能多线程?
能的.如:perl,python等就自带多线程函数,而且跨平台.
au3不能多线程?
也是能的,不过要走曲线救国路线.如shellcode.
但是shellcode要求你必须要懂得汇编,嗯嗯.懂了汇编,神马都是浮云.^_^ AU3本质上与其他脚本并无区别,正如MsgBox() or InetGet()已经调用了多线程。
但AU3在设计之初并没有考虑线程的问题,很多函数的设计违背了线程的思想,以至于作者没有能力更改(应该说没有money没有动力),所以就变成今天的模样。 au3编译,是伪编译吗?我看速度那么快,感觉像是伪编译。如果是的话,不支持多线程也不奇怪了 没学过C,不知它怎么实现的。系统自带的Dll有几百个,里面的函数总共有几万个,根本不可能找不到,找不到也并不代表没有这样的功能,像那个SkinCrafterDll.dll皮肤dll,虽然操作系统没有直接给出设置皮肤的函数,但SkinCrafterDll.dll最终还不是调用了微软的绘图函数?积累的多了,自然就能找到。自不必说 自己写的话麻烦至极,应该把精力放在程序的编写效率上面什么的。已经把最底层的函数给你了,那么所有位于其高层的功能都可以实现。
页:
[1]
2