Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вопрос по TrayItemSetOnEvent: как выйти из скрипта в данной ситуации? (http://forum.oszone.net/showthread.php?t=152541)

evg64 07-10-2009 07:45 1236494

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

Код:

$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 07-10-2009 08:16 1236506

Цитата:

Цитата evg64
программа перестает реагировать на все остальные команды юзера через меню трея »

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

Код:

$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



Время: 21:51.

Время: 21:51.
© OSzone.net 2001-