[решено] Вопрос по TrayItemSetOnEvent: как выйти из скрипта в данной ситуации?

Ответить
Аватара пользователя
evg64

[решено] Вопрос по TrayItemSetOnEvent: как выйти из скрипта в данной ситуации?

Сообщение evg64 »

Добрый день! Для иллюстрации проблемы я сделал маленький скрипт:


читать дальше »






Код:

Код: Выделить всё

$ExitLoop=1
Opt("TrayMenuMode",1)
Opt("TrayOnEventMode",1)
HotKeySet("{esc}","ExitFunc")
$CurrentTime=TrayCreateItem("StartLoop")
TrayItemSetOnEvent ( -1, "StartLoop" )
$Exit=TrayCreateItem("Exit")
TrayItemSetOnEvent ( -1, "ExitFunc" )
while 1
sleep(100)
wend
Func StartLoop()
m("StartLoop() starts")
if $ExitLoop=1 then
$ExitLoop=0
else
$ExitLoop=1
endif
while not $ExitLoop
sleep(100)
wend
EndFunc
Func ExitFunc()
m("ExitFunc() starts")
Exit
EndFunc







Проблема вот в чем: когда щелкаешь на опцию трея "StartLoop", программа перестает реагировать на все остальные команды юзера через меню трея (потому что StartLoop зацикливает там все). А вот HotKeySet работает прекрасно вне зависимости от того, была ли нажата кнопка "StartLoop". Вопрос: как заставить прогу реагировать на команды через меню трея после вызова функции "StartLoop"?
Аватара пользователя
Creat0R

Re: [решено] Вопрос по TrayItemSetOnEvent: как выйти из скрипта в данной ситуации?

Сообщение Creat0R »

Цитата evg64:



программа перестает реагировать на все остальные команды юзера через меню трея
[решено] Вопрос по TrayItemSetOnEvent: как выйти из скрипта в данной ситуации?




Потому что обработка событии продолжается только после завершения вызванной событием функции - в этом случае лучше всего обрабатывать события в главном цикле:





Код:

Код: Выделить всё

$iLoop = False
Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 1)
HotKeySet("{esc}", "ExitFunc")
$CurrentTime = TrayCreateItem("StartLoop")
TrayItemSetOnEvent(-1, "StartLoop")
$Exit = TrayCreateItem("Exit")
TrayItemSetOnEvent(-1, "ExitFunc")
While 1
    Sleep(100)
    If $iLoop Then Loop_Proc()
WEnd
Func StartLoop()
    ;m("StartLoop() starts")
    $iLoop = Not $iLoop
    $sText = "StartLoop"
    If $iLoop Then $sText = "StopLoop"
    TrayItemSetText($CurrentTime, $sText)
EndFunc
Func Loop_Proc()
    While Not $iLoop
        Sleep(100)
    WEnd
EndFunc
Func ExitFunc()
    ;m("ExitFunc() starts")
    Exit
EndFunc
Ответить

Вернуться в «AutoIt»