Таймер
|
Новый участник Сообщения: 38 |
Подскажите с задачкой, требуется таймер, который будет выполняться в полной независимости от остального кода. По истечению времени будет выполняться действие. Т.е. Таймер должен работать независимо от самого скрипта, ровно как 2 макроса [скрипт] и [таймер] единовременно.
|
|
Отправлено: 18:02, 29-11-2011 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать winipox, AutoIt — однопоточное приложение. Так что и делайте два макроса. Либо согласитесь на то, что при работе процедуры обработки события тайминга основное приложение будет временно «заморожено».
|
Отправлено: 21:10, 29-11-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 00:09, 30-11-2011 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата madmasles:
|
|
Отправлено: 02:48, 30-11-2011 | #4 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать 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 |
|
Последний раз редактировалось madmasles, 30-11-2011 в 12:05. Отправлено: 11:22, 30-11-2011 | #5 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать winipox,
Предупреждение за нарушение правил форума, пункт 2.7 и пункт 3.19: Цитата:
|
|
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 17:43, 30-11-2011 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать madmasles, Вы меня не поняли. Добавьте, например, в обработку вычиcления пообъёмнее, даже хотя бы симулировать банально Sleep()'ом:
Func _UpdateProgressBar($hWnd, $Msg, $iIDTimer, $dwTime) … Sleep(5000) EndFunc ;==>_UpdateProgressBar Цитата Iska:
|
|
Отправлено: 22:53, 30-11-2011 | #7 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Iska,
Я Вас и сейчас не понимаю. Что значит вычисления пообъёмнее? Пример? Зачем в функцию _UpdateProgressBar() добавлять Sleep(5000)? |
Отправлено: 23:53, 30-11-2011 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать madmasles, для того, чтобы показать, что при работе процедуры выполнение основного кода скрипта будет приостановлено до её завершения.
|
Отправлено: 01:56, 01-12-2011 | #9 |
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать Цитата Iska:
PS С помощью Sleep() можно много чего испортить, например: #include <GuiConstantsEx.au3> $hGui = GUICreate('Test') $nBtn = GUICtrlCreateButton('Test', 20, 20) GUISetState() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $nBtn MsgBox(64, 'Info', 'Click', 0, $hGui) EndSwitch ;Sleep(1000);раскомментируйте строку и скрипт не будет работать. WEnd |
|
Отправлено: 08:51, 01-12-2011 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Win32 API - Таймер | Холопайнен | Программирование и базы данных | 0 | 09-05-2010 19:37 | |
Диагностика - Компьютерный Таймер | germund | Программное обеспечение Windows | 7 | 22-04-2010 18:09 | |
Таймер на JS | Vlad Drakula | Вебмастеру | 8 | 16-04-2005 22:01 | |
Таймер на js | Guest | Вебмастеру | 7 | 25-08-2004 12:31 | |
таймер | Guest | Вебмастеру | 1 | 05-02-2004 23:58 |
|