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
-------------------------------------------------------
但在某个线程还没处理完时
就有代码请求解析执行
系统返回结果(
你"不死"再给你个线程
你不懂"处理"你去"排程"……那是你的事
) ;偶猜的,勿当真.
页: 1 [2] 3
查看完整版本: 希望au4可以真的实现多线程