找回密码
 加入
搜索
查看: 1736|回复: 4

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

[复制链接]
发表于 2009-6-3 00:31:06 | 显示全部楼层 |阅读模式
本帖最后由 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[0] Then    ;该线程内容(内容不能有Sleep延迟参数)
                $S1=$S1+1 
                GUICtrlSetData($Label1, $S1) 
        ElseIf $idEvent = $Timer2DLL[0] Then  ;该线程内容(内容不能有Sleep延迟参数)
                $S2=$S2+1
                GUICtrlSetData($Label2, $S2)
        ElseIf $idEvent = $Timer3DLL[0] Then    ;该线程内容(内容不能有Sleep延迟参数,)
                $S3=$S3+1
                GUICtrlSetData($Label3, $S3)
        EndIf
EndFunc
发表于 2009-6-3 11:58:39 | 显示全部楼层
我试多线程中也加了SLEEP函数,但可以停止啊?
 楼主| 发表于 2009-6-3 12:38:44 | 显示全部楼层
可是我在代码38行后面加一行SLEEP(3000)
多线程就无法停止了
而且三组线程的数字变化间隔也会错误

谢谢
发表于 2009-6-3 13:41:57 | 显示全部楼层
这都不是真正的多线程,跟Adlib一样, 函数应该尽可能的简单,因为它要频繁地执行而且在执行期间主脚本将被暂停。
推荐使用3.3.1.0的新函数AdlibRegister(), AdlibUnRegister() 和 AdlibDisable(),跟你那"SetTimer",功能差不多。
3.3.1.0之前则是AdlibEnable()和 AdlibDisable()无法创建多个。
发表于 2009-6-3 15:26:13 | 显示全部楼层
我用的还是旧版,看来为了伪多线程要更新一下了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-11 03:43 , Processed in 0.090445 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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