PDA

Показать полную графическую версию : [решено] Возможен ли запуск одновременный запуск 2ух func?


JaguarSP
22-04-2010, 18:45
Возможен ли запуск одновременный запуск 2ух func?
Т.е. например вот так:

_func1 & _func2

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

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

Centrinar
22-04-2010, 19:46
#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
Получается две func работают параллельно, а не последовательно »
Только с использованием дополнительного процесса (запуск ещё одной инстанций скрипта).




© OSzone.net 2001-2012