Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Возможен ли запуск одновременный запуск 2ух func? (http://forum.oszone.net/showthread.php?t=173813)

JaguarSP 22-04-2010 18:45 1398687

Возможен ли запуск одновременный запуск 2ух func?
 
Возможен ли запуск одновременный запуск 2ух func?
Т.е. например вот так:

_func1 & _func2

Func _Func1()
бла бла бла
бла бла бла
sleep(60 000)
Endfunc

Func _Func2()
бла бла бла
бла бла бла
Endfunc
Получается две func работают параллельно, а не последовательно...
И еще дело в том что в одном func написан слип(а он как бы останавливает весь скрипт), мб есть что то что замораживает только func?

Centrinar 22-04-2010 19:46 1398720

Код:

#include <GUIConstantsEx.au3>
;

Opt("GUIOnEventMode", 1)

Global $ahCallBack[2], $iPrecent

$hGUI = GUICreate("ProgressBar", 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

$Progress = GUICtrlCreateProgress(10, 10, 300, 22)
$Status_Label = GUICtrlCreateLabel("0%", 330, 30, 30, 20)

$Button = GUICtrlCreateButton("Start", 150, 100, 50, 20)
GUICtrlSetOnEvent(-1, "_Main_Events")

GUISetState()

While 1
    Sleep(100)

    If $iPrecent > 0 Then
        ;Тут мы вызываем нашу функцию
        Call("_SomeFunction_Proc")
    EndIf
WEnd

Func _Main_Events()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            _CallBack_Free($ahCallBack)
            Exit
        Case $Button
            If GUICtrlRead($Button) = "Stop" Then
                GUICtrlSetData($Button, "Start")
                _CallBack_Free($ahCallBack)
            Else
                GUICtrlSetData($Button, "Stop")
                $ahCallBack = _CallBack_Init("_SetProgress_Proc", 10)
            EndIf
    EndSwitch
EndFunc  ;==>_Main_Events

Func _SomeFunction_Proc()
    While $iPrecent > 0
        Sleep(1000)
        MsgBox(0, "", "Наша функция работает на ряду с прогрессом :)... " & $iPrecent)
    WEnd
EndFunc  ;==>_SomeFunction_Proc

Func _SetProgress_Proc()
    $iPrecent += 1

    GUICtrlSetData($Progress, Round($iPrecent / 3))
    GUICtrlSetData($Status_Label, Round($iPrecent / 3) & "%")

    If $iPrecent > 300 Then
        $iPrecent = 0

        GUICtrlSetData($Status_Label, "100%")
        GUICtrlSetData($Button, "Start")
        _CallBack_Free($ahCallBack)

        $ahCallBack = 0
        Dim $ahCallBack[2] = [-1, -1]
    EndIf
EndFunc  ;==>_SetProgress_Proc

Func _CallBack_Init($sFuncName, $iTime, $sParam = "")
    Local $hCallBack = DllCallbackRegister($sFuncName, "int", $sParam)

    Local $aTimer = DllCall("user32.dll", "uint", "SetTimer", _
            "hwnd", 0, "uint", 0, "int", $iTime, "ptr", DllCallbackGetPtr($hCallBack))

    Local $ahCallBack[2] = [$hCallBack, $aTimer[0]]

    Return $ahCallBack
EndFunc  ;==>_CallBack_Init

Func _CallBack_Free($ahCallBack)
    If $ahCallBack[0] <> -1 Then DllCallbackFree($ahCallBack[0])
    If $ahCallBack[1] <> -1 Then DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $ahCallBack[1])
EndFunc  ;==>_CallBack_Free


Creat0R 22-04-2010 20:22 1398742

Цитата:

Цитата JaguarSP
Получается две func работают параллельно, а не последовательно »

Только с использованием дополнительного процесса (запуск ещё одной инстанций скрипта).


Время: 13:55.

Время: 13:55.
© OSzone.net 2001-