Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Таймер

Ответить
Настройки темы
Таймер

Новый участник


Сообщения: 38
Благодарности: 0

Профиль | Отправить PM | Цитировать


Подскажите с задачкой, требуется таймер, который будет выполняться в полной независимости от остального кода. По истечению времени будет выполняться действие. Т.е. Таймер должен работать независимо от самого скрипта, ровно как 2 макроса [скрипт] и [таймер] единовременно.

Отправлено: 18:02, 29-11-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


winipox, AutoIt — однопоточное приложение. Так что и делайте два макроса. Либо согласитесь на то, что при работе процедуры обработки события тайминга основное приложение будет временно «заморожено».
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:10, 29-11-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Цитата Iska:
основное приложение будет временно «заморожено». »
Смотря что будет делать основное приложение. В некоторых случаях можно использовать _Timer_SetTimer().

Отправлено: 00:09, 30-11-2011 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата madmasles:
В некоторых случаях можно использовать _Timer_SetTimer(). »
И…? Поясните, это сделает возможным в одном скрипте AutoIt исполнение процедуры и, одновременно, продолжение исполнения основного кода скрипта?

Отправлено: 02:48, 30-11-2011 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


winipox,
Предупреждение за нарушение правил форума, пункт 2.7 и пункт 3.19:

Цитата:
2.7: В заголовке темы обязательно обозначайте название предмета, которого касается вопрос, а в теле сообщения максимально подробно опишите проблему (приведите аппаратную/программную конфигурацию, а также изложите ситуацию, в которой возникает проблема)...
Подробнее о принципах создания тем читайте в этом документе и Правилах форумов.

3.19: Запрещается... Создавать темы, имеющие неинформативные или состоящие из заглавных букв заголовки (например, "Помогите!", "HELP!", "У меня проблема"). Такие темы будут закрыты или перенесены в Тест-форум. Если вы хотите вернуть перенесенную тему обратно, пока ее не закрыли в Тест-форуме, измените ее заголовок на осмысленный и напишите об этом в теме.
Переименуйте пожалуйста тему (Как переименовать свою тему?).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


madmasles, Вы меня не поняли. Добавьте, например, в обработку вычиcления пообъёмнее, даже хотя бы симулировать банально Sleep()'ом:
Код: Выделить весь код
Func _UpdateProgressBar($hWnd, $Msg, $iIDTimer, $dwTime)
	…
	Sleep(5000)
EndFunc   ;==>_UpdateProgressBar
и что получится с основным циклом? Понимаете меня? То есть, это:
Цитата Iska:
Либо согласитесь на то, что при работе процедуры обработки события тайминга основное приложение будет временно «заморожено». »

Отправлено: 22:53, 30-11-2011 | #7


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Iska,
Я Вас и сейчас не понимаю. Что значит вычисления пообъёмнее? Пример? Зачем в функцию _UpdateProgressBar() добавлять Sleep(5000)?

Отправлено: 23:53, 30-11-2011 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


madmasles, для того, чтобы показать, что при работе процедуры выполнение основного кода скрипта будет приостановлено до её завершения.

Отправлено: 01:56, 01-12-2011 | #9


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Таймер

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход