twh2000 发表于 2009-6-3 00:31:06

多线程内使用SLEEP语法的问题?

本帖最后由 twh2000 于 2009-6-5 17:18 编辑

我用的多线程是参考78391493成员修改来的
http://www.autoitx.com/forum.php?mod=viewthread&tid=5048

在线程内容中好像不能有SLEEP函数,会使多线程无法停止,
我要如何在线程内容加入SLEEP函数(因为我要用到动态延迟)

谢谢
代码如下;;;;;;;;;;;;要在AutoIt 3.3版以后才可执行;;;;;;;;;;;;;;;;;

$Form1 = GUICreate("多线程测试", 272, 139, -1, -1)         ;建立GUI视窗表单
$Label1 = GUICtrlCreateLabel("1", 8, 8, 146, 17)            ;建立文字物件1
$Label2 = GUICtrlCreateLabel("1", 8, 56, 150, 17)             ;建立文字物件2
$Label3 = GUICtrlCreateLabel("1", 8, 104, 148, 17)            ;建立文字物件3
$OK = GUICtrlCreateButton("启动多线程", 168, 8, 89, 25, 0)   ;建立启动多线程按钮
$NO = GUICtrlCreateButton("停止多线程", 168, 48, 89, 25, 0);建立停止多线程按钮

$S1=1                   ;测试用变量可删除
$S2=1                   ;测试用变量可删除
$S3=1                   ;测试用变量可删除
GUISetState(@SW_SHOW)   ;显示GUI视窗表单       
While 1
Switch GUIGetMsg();侦测表单讯号(如按按钮)
        Case - 3
                Exit
        Case $OK      ;当按下启动多线程按钮时
                        ;;;;;;;;;;三组多线程开始
$Timer1 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer1DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0,"uint", 0, "int", 500,"ptr", DllCallbackGetPtr($Timer1)) ;500是该线程循环延迟的时间,可用变量来控制
$Timer2 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer2DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0,"uint", 0, "int", 500, "ptr", DllCallbackGetPtr($Timer2)) ;500是该线程循环延迟的时间,可用变量来控制
$Timer3 = DllCallbackRegister("Timer", "int", "hwnd;uint;uint;dword")
$Timer3DLL = DllCall("user32.dll", "uint", "SetTimer", "hwnd",0,"uint",0, "int", 500, "ptr", DllCallbackGetPtr($Timer3)) ;500是该线程循环延迟的时间,可用变量来控制       
        Case $NO
                        ;;;;;;;;;;三组多线程同时停止
                        DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Timer1DLL)
                        DllCallbackFree($Timer1)                                                   ;该线程停止
                        DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Timer2DLL)
                        DllCallbackFree($Timer2)                                                   ;该线程停止
                        DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Timer3DLL)
                        DllCallbackFree($Timer3)                                                       ;该线程停止                                                      
        EndSwitch
WEnd

Func Timer($hWnd, $uiMsg, $idEvent, $dwTime)
        If $idEvent = $Timer1DLL Then    ;该线程内容(内容不能有Sleep延迟参数)
                $S1=$S1+1
                GUICtrlSetData($Label1, $S1)
        ElseIf $idEvent = $Timer2DLL Then;该线程内容(内容不能有Sleep延迟参数)
                $S2=$S2+1
                GUICtrlSetData($Label2, $S2)
        ElseIf $idEvent = $Timer3DLL Then    ;该线程内容(内容不能有Sleep延迟参数,)
                $S3=$S3+1
                GUICtrlSetData($Label3, $S3)
        EndIf
EndFunc

FBWOLF 发表于 2009-6-3 11:58:39

我试多线程中也加了SLEEP函数,但可以停止啊?

twh2000 发表于 2009-6-3 12:38:44

可是我在代码38行后面加一行SLEEP(3000)
多线程就无法停止了
而且三组线程的数字变化间隔也会错误

谢谢

make2855 发表于 2009-6-3 13:41:57

这都不是真正的多线程,跟Adlib一样, 函数应该尽可能的简单,因为它要频繁地执行而且在执行期间主脚本将被暂停。
推荐使用3.3.1.0的新函数AdlibRegister(), AdlibUnRegister() 和 AdlibDisable(),跟你那"SetTimer",功能差不多。
3.3.1.0之前则是AdlibEnable()和 AdlibDisable()无法创建多个。

lynfr8 发表于 2009-6-3 15:26:13

我用的还是旧版,看来为了伪多线程要更新一下了
页: [1]
查看完整版本: 多线程内使用SLEEP语法的问题?