找回密码
 加入
搜索
查看: 5274|回复: 10

[系统综合] AU3多线程函数

  [复制链接]
发表于 2008-5-24 14:18:29 | 显示全部楼层 |阅读模式
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Global Enum $TIMERID1 = 1001, $TIMERID2, $TIMERID3
Global $iLabel, $iMemo, $Count, $Var = 1, $Var2 = 1, $hGUI, $iTimer1, $iTimer2, $hCallBack, $hCallBack2, $First = 1

$hGUI = GUICreate("My Timers", 600, 296)
GUISetBkColor(0xFFFFFF)
$iLabel = GUICtrlCreateLabel("0", 10, 10, 100, 25)
$iLabel2 = GUICtrlCreateLabel("0", 150, 10, 300, 25)
$iMemo = GUICtrlCreateEdit("", 2, 32, 596, 262, BitOR($WS_HSCROLL, $WS_VSCROLL))
GUICtrlSetState($iMemo, $GUI_DISABLE)
GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
GUISetState()
$hCallBack = DllCallbackRegister("_TimerCallBackFunc", "none", "hwnd;int;int;dword")
$hCallBack2 = DllCallbackRegister("_TimerCallBackFunc", "none", "hwnd;int;int;dword")
$hCallBack3 = DllCallbackRegister("_TimerCallBackFunc", "none", "hwnd;int;int;dword")
$iTimer1 = _WinAPI_SetTimer($hGUI, $TIMERID1, 1000, DllCallbackGetPtr($hCallBack))
Sleep(100)
$iTimer2 = _WinAPI_SetTimer($hGUI, $TIMERID2, 5000, DllCallbackGetPtr($hCallBack2))
$iTimer3 = _WinAPI_SetTimer($hGUI, $TIMERID3, 3000, DllCallbackGetPtr($hCallBack3))

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

_WinAPI_KillTimer($hGUI, $iTimer1)
_WinAPI_KillTimer($hGUI, $iTimer2)
DllCallbackFree($hCallBack)
DllCallbackFree($hCallBack2)

Func _WinAPI_SetTimer($hWnd, $iIDEvent, $iElapse, $pTimerFunc = 0)
    Local $iResult = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", $iIDEvent, "int", $iElapse, "ptr", $pTimerFunc)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0]
EndFunc   ;==>_WinAPI_SetTimer

Func _WinAPI_KillTimer($hWnd, $iIDEvent)
    Local $iResult = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", $iIDEvent)
    If @error Then Return SetError(-1, -1, 0)
    Return $iResult[0] <> 0
EndFunc   ;==>_WinAPI_KillTimer

Func _TimerCallBackFunc($hWnd, $Msg, $iIDTimer, $dwTime)
    If $First = 1 And $iIDTimer = $TIMERID1 Then
        $First = 0
        Global $FirstTime = $dwTime
    EndIf
    GUICtrlSetData($iMemo, "hWnd : " & $hWnd & "  Msg : " & $Msg & "  iIDTimer : " & $iIDTimer & "  dwTime : " & $dwTime & @CRLF, 1)
    GUICtrlSetData($iLabel2, $dwTime - $FirstTime)
    If $iIDTimer = $TIMERID1 Then
        If $Var = 1 Then
            $Count += 1
        Else
            $Count -= 1
        EndIf
        GUICtrlSetData($iLabel, $Count)
    ElseIf $iIDTimer = $TIMERID2 Then
        If $Var = 1 Then
            $Var = 2
        Else
            $Var = 1
        EndIf
    Else
        If $Var2 = 1 Then
            GUISetBkColor(0x000000)
            GUICtrlSetColor($iLabel, 0xFFFFFF)
            GUICtrlSetColor($iLabel2, 0xFFFFFF)
            $Var2 = 2
        Else
            GUISetBkColor(0xFFFFFF)
            GUICtrlSetColor($iLabel, 0x000000)
            GUICtrlSetColor($iLabel2, 0x000000)
            $Var2 = 1
        EndIf
    EndIf
EndFunc   ;==>_TimerCallBackFunc


这段代码有人发到论坛好多天了,测试正常,就是不知道怎么用,谁帮加点注释啊
发表于 2008-6-3 22:51:45 | 显示全部楼层
我也不知道怎么用,请高手帮忙加点说明之类的东东!!!
发表于 2009-11-23 01:16:48 | 显示全部楼层
我也不知道怎么用,请高手帮忙加点说明之类的东东!!!
发表于 2009-11-23 10:12:18 | 显示全部楼层
這個是計時器,不是多線程

3.3.1.6 可以用
AdlibRegister("MyAdlib1")
AdlibRegister("MyAdlib2")
AdlibRegister("MyAdlib3")

效果應該是一樣的
发表于 2009-11-26 21:10:35 | 显示全部楼层
发表于 2009-11-27 10:35:19 | 显示全部楼层
之前用过,效果不理想。
发表于 2009-11-27 15:28:04 | 显示全部楼层
来学习一下准备用
发表于 2009-11-27 17:35:04 | 显示全部楼层
收藏, 学习之....
发表于 2009-12-1 20:41:53 | 显示全部楼层
有个库叫CoProc.au3用多进程模拟多线程,能完成一定程度的并行工作
坛子里有个CoProc的补丁
发表于 2010-7-26 11:26:47 | 显示全部楼层
多線程好像都是利用USER32.DLL 的settimeer函數。。
與定時程序,我決定還是有點差別。
看過好多這樣案例的多線程。我決定這個比較好理解,dllcall不如直接API函數直觀名聯
发表于 2010-7-26 14:02:20 | 显示全部楼层
回复 10# guowenfu
timer是timer,thread是thread,不是一个东西
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 12:19 , Processed in 0.083756 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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