kingfirekkk
发表于 2011-1-15 08:39:33
多线程/多进程尚未深入了解,前来给C版助威。。。
_ddqs.
发表于 2011-1-15 12:40:49
源码区(示例)
http://www.autoitx.com/forum.php?mod=viewthread&tid=16714&fromuid=7653769
$Form1 = GUICreate("多线程实例", 272, 139, -1, -1)
$Label1 = GUICtrlCreateLabel("00:00:00:00", 8, 8, 146, 17)
$Label2 = GUICtrlCreateLabel("0", 8, 56, 150, 17)
$Label3 = GUICtrlCreateLabel("", 8, 104, 148, 17)
$Button1 = GUICtrlCreateButton("关闭线程1", 168, 8, 89, 25, 0)
$Button2 = GUICtrlCreateButton("关闭线程2", 168, 48, 89, 25, 0)
$Button3 = GUICtrlCreateButton("关闭线程3", 168, 96, 89, 25, 0)
GUISetState(@SW_SHOW)
MsgBox(0,0,"昏迷中...",9) ;阻塞——延时9秒测试(这在找死)
Global $t2, $t3 = 1 ;
$Timer = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$TimerDLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 1000, "ptr", DllCallbackGetPtr($Timer))
$Timer2 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer2DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 200, "ptr", DllCallbackGetPtr($Timer2))
$Timer3 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer3DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 500, "ptr", DllCallbackGetPtr($Timer3))
MsgBox(0,0,"想找死") ;阻塞中。。。
MsgBox(0,0,"想找死") ;阻塞中。。
While 1
ConsoleWrite("阻塞中。。。"&@CRLF)
Sleep(50) ;
WEnd
While 1
Switch GUIGetMsg()
Case - 3
Exit
Case $Button1
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $TimerDLL)
;DllCallbackFree($Timer)
Case $Button2
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Timer2DLL)
;DllCallbackFree($Timer2)
Case $Button3
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Timer3DLL)
;DllCallbackFree($Timer3)
EndSwitch
WEnd
Func Timer($hWnd, $uiMsg, $idEvent, $dwTime)
If $idEvent = $TimerDLL Then
GUICtrlSetData($Label1, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC)
ElseIf $idEvent = $Timer2DLL Then
$t2 += 1
GUICtrlSetData($Label2, $t2)
ElseIf $idEvent = $Timer3DLL Then
$t3 *= 2
GUICtrlSetData($Label3, $t3)
EndIf
If $t3 = 0 Then ;解除阻塞!
ControlClick("0","确定","","",2)
Exit
EndIf
EndFunc
pusofalse
发表于 2011-1-15 17:08:38
回复 13# happytc
happytc兄给出的这段代码,逻辑很糟,当然我知道这只是一个演示代码。到真正需要实现某个功能时,肯定会有变通的方法,以至于不会发生阻塞,或者阻塞程度不会如上面这段代码般严重,这要具体问题具体分析。
当你学会了 用一种方法很完美地解决了某一个问题之后,一定要了解到,解决这个问题的方法其实是有两种的,只是另一种方法目前还不知道,在必要的探索之后,你一定能掌握第二种方法,同样的,你学会了这两种方法之后,其实还有第三种方法可以更加完美地解决这个问题,依此下去,解决一个问题的方法可以有无限多个,自不必说“能解决问题就好”,“够用就行”的想法是阻碍进步的最主要的原因,况且现在连一个方法也没有掌握。
happytc
发表于 2011-1-15 23:05:47
回复 18# pusofalse
的确,那个仅仅是个例子
其实是想说明一个问题:当一部分(如上面的Func1)遇到问题时(如编程时鲁棒性考虑不周),希望不影响别的部分运行(如Func2),毕竟用户的环境在多种多样和复杂的。有时很难全面考虑到。P兄你说到的“另一种方法”的确有时可以曲线解决问题。但就得遇到问题,既使是非常小概率的问题,你也得考虑周全才行了,也就是不得不面对小概率事件没有考虑到而影响整个程序运行。当代码量大了,潜伏的在特别情况下会发生的问题就会多起来,这时你想一个个地“另一种方法”就会让你陷入无限细节中。若是一部分出问题,并不会影响别的部分,这样就会使程序的鲁棒性大大提高
happytc
发表于 2011-1-15 23:10:40
回复 17# _ddqs.
这不是真的多线程,只是个跟单片机那种机制一样的东西,也就是跟adlib一样的东西。其实还是一个线程
不信,你打开windows的任务管理器看看这个程序的线程数就知道了
_ddqs.
发表于 2011-1-16 02:10:27
搞不懂线程问题,线程数要多少才叫单先程(上个图先)
----------------------------------------------------------------
定时器测试:
AU3多线程^_^【.exe
开始运行时为3 ,第一个MSGBOX()去掉后是2Sleep(22000) ;只单行代码测试,运行也显示2
_ddqs.
发表于 2011-1-16 02:21:06
本帖最后由 _ddqs. 于 2011-1-16 02:28 编辑
这是没加入定时器时的测试代码(在有加入定时器的脚本中使用 AdlibRegister, 其效果会不一样)
AdlibRegister("_test", 1000)
Sleep(2000)
MsgBox(0,0,"挂起") ;当挂起时 用 AdlibRegister 的函数 "_test" 会运行不了
Func _test()
ConsoleWrite(TimerInit() &@CRLF)
EndFunc
Sleep(22000)
republican
发表于 2011-1-16 08:27:38
回复 21# _ddqs.
......那我写的程序不是有7个线程?
mo_shaojie
发表于 2011-1-16 09:06:46
楼主真强,还有AU4出来的?那有没有AU5的啊?
lxz
发表于 2011-1-16 09:30:42
AU4?汗死....
happytc
发表于 2011-1-16 09:41:35
回复 21# _ddqs.
那个2,是msgbox整出来的,是编辑器的多线程,而不是你写的程序
happytc
发表于 2011-1-16 09:42:23
回复 24# mo_shaojie
你语文太差了,是“希望”,当然是将来时。
nxbigdaddy
发表于 2011-1-16 10:13:15
真的会有 au4吗?期望早点到来!
lixiaolong
发表于 2011-1-16 11:31:38
按理说,应该可以实现多线程,只是想不到.
_ddqs.
发表于 2011-1-16 15:41:13
回复 26# happytc
虽然脚本中没有新建线程的显式代码(怎样创建到目前还不知)
-----------------------------------------------------------
解析器本身就是以多线程启动(2+)并能支持多线程解析功能
你想象下
如果他只是单线程
当运行到最后1个循环挂起语句时,那脚本的其他语句是会运行不了的
While 1
Sleep(3000)
WEnd
-------------------------------------------------------
但在某个线程还没处理完时
就有代码请求解析执行
系统返回结果(
你"不死"再给你个线程
你不懂"处理"你去"排程"……那是你的事
) ;偶猜的,勿当真.