Iska,
Пример. Одновременно работают основной цикл, часы, прогресс и его строковое значение. При этом можно прервать цикл или выйти из программы (если выход во время работы цикла, то код выхода 1).
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <Timers.au3>
#include <GuiStatusBar.au3>
#include <ProgressConstants.au3>
#include <EditConstants.au3>
#include <MenuConstants.au3>
Global $nMemo, $hStatusBar, $nProgress, $iPercent = 0, $direction = 1, $aParts[3] = [100, 300, -1], _
$nBtn_start, $nBtn_stop, $iTimerProgress, $iStart, $iTimeOut = 60000, $fWork, $fStop
$hGUI = GUICreate('Test Func _Timer_SetTimer()', 400, 320, -1, -1, -1, $WS_EX_TOOLWINDOW)
$nMemo = GUICtrlCreateEdit('', 2, 32, 396, 226, BitOR($WS_HSCROLL, $WS_VSCROLL, $ES_READONLY))
GUICtrlSetFont($nMemo, 9, 400, 0, 'Courier New')
$nBtn_start = GUICtrlCreateButton('Start', 70, 265, 100, 25)
$nBtn_stop = GUICtrlCreateButton('Stop', 215, 265, 90, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$hStatusBar = _GUICtrlStatusBar_Create($hGUI, $aParts)
_GUICtrlStatusBar_SetText($hStatusBar, @TAB & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), 2)
$nProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
_GUICtrlStatusBar_EmbedControl($hStatusBar, 1, GUICtrlGetHandle($nProgress))
GUICtrlSetState($nProgress, $GUI_HIDE)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
_Timer_SetTimer($hGUI, 1000, '_UpdateStatusBarClock')
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $nBtn_start
$fWork = True
$fStop = False
$iStart = TimerInit()
GUICtrlSetData($nProgress, 0)
GUICtrlSetState($nProgress, $GUI_SHOW)
GUICtrlSetState($nBtn_stop, $GUI_ENABLE)
GUICtrlSetState($nBtn_start, $GUI_DISABLE)
GUICtrlSetData($nMemo, '')
$iTimerProgress = _Timer_SetTimer($hGUI, 100, '_UpdateProgressBar')
_BasicCycle()
EndSwitch
WEnd
Func _BasicCycle()
;основной цикл для примера
Local $i_Count = 0, $s_Mess
MemoWrite('Основной цикл будет работать ' & StringFormat('%d сек.', $iTimeOut / 1000) & @CRLF)
MemoWrite('Его можно прервать, нажав кнопку "Stop".' & @CRLF)
MemoWrite('~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~' & @CRLF)
MemoWrite('Работает основной цикл.' & @CRLF)
While 1
$i_Count += 1
$s_Mess = $i_Count & ','
If Not Mod($i_Count, 12) Then $s_Mess &= @CRLF
MemoWrite($s_Mess)
Sleep(Random(100, 500, 1))
If Not $fWork Then ExitLoop
If $fStop Then ExitLoop
WEnd
_Timer_KillTimer($hGUI, $iTimerProgress)
GUICtrlSetState($nProgress, $GUI_HIDE)
GUICtrlSetState($nBtn_stop, $GUI_DISABLE)
GUICtrlSetState($nBtn_start, $GUI_ENABLE)
If $fStop Then
MemoWrite(@CRLF & '~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~' & @CRLF)
MemoWrite('Основной цикл прерван пользователем.' & @CRLF)
Else
MemoWrite(@CRLF & '~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~' & @CRLF)
MemoWrite('Основной цикл закончен по таймауту.' & @CRLF)
EndIf
EndFunc ;==>_BasicCycle
Func _UpdateStatusBarClock($hWnd, $Msg, $iIDTimer, $dwTime)
#forceref $hWnd, $Msg, $iIDTimer, $dwTime
_GUICtrlStatusBar_SetText($hStatusBar, @TAB & StringFormat('%02d:%02d:%02d', @HOUR, @MIN, @SEC), 2)
EndFunc ;==>_UpdateStatusBarClock
Func _UpdateProgressBar($hWnd, $Msg, $iIDTimer, $dwTime)
#forceref $hWnd, $Msg, $iIDTimer, $dwTime
Local $s_Mess, $i_Diff
$i_Diff = TimerDiff($iStart)
$iPercent = Int(100 * $i_Diff / $iTimeOut)
$s_Mess = StringFormat('%.1f сек(%02d%)', $i_Diff / 1000, $iPercent)
If $iPercent = 100 Then
$fWork = False
$s_Mess = StringFormat('%.1f сек(%02d%)', $iTimeOut / 1000, $iPercent)
EndIf
GUICtrlSetData($nProgress, $iPercent)
_GUICtrlStatusBar_SetText($hStatusBar, @TAB & $s_Mess, 0)
EndFunc ;==>_UpdateProgressBar
Func MemoWrite($s_Message)
GUICtrlSetData($nMemo, $s_Message, 1)
EndFunc ;==>MemoWrite
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0xFFFF)
Switch $nID
Case $SC_CLOSE
If $fWork Then Exit 1
Exit
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_SYSCOMMAND
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0xFFFF)
Switch $nID
Case $nBtn_stop
$fStop = True
$fWork = False
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
|