Что нового

[Элементы GUI] Запустить/Остановить непрерывный цикл при клике по меню в трее

bobuni

Новичок
Сообщения
9
Репутация
0
1. Как при клике в трее "Run" запустить 2,3,4..N непрерывный цикл выполнения функции program()
2. Как при клике в трее "Exit" остановить (все, если запущено несколько) непрерывный цикл

Код:
Opt("TrayMenuMode",3)

$runitem  = TrayCreateItem("Run")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")
TraySetState()

While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = 0
            ContinueLoop
        Case $msg = $runitem
            program()
        Case $msg = $exititem
            ExitEvent()
    EndSelect
WEnd

Func program()
While 1
RunWait("program.exe")
WEnd
EndFunc

Func ExitEvent()
    Exit
EndFunc
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Как-нибудь так. [писал быстро, не проверял]:
Код:
Opt("TrayMenuMode",3)

$runitem  = TrayCreateItem("Run")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")
TraySetState()

While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = 0
            ContinueLoop
        Case $msg = $runitem
            program()
        Case $msg = $exititem
            ExitEvent()
    EndSelect
WEnd

Func program()
$PID = Run("program.exe")
While ProcessExists($PID)
If TrayGetMsg() = $exititem Then
ProcessClose($PID)
ExitLoop
EndIf
Sleep(10)
WEnd
EndFunc

Func ExitEvent()
    Exit
EndFunc
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0
ММ, наверное не правильно объяснил.

Код:
Func program()
While 1
RunWait("program.exe")
WEnd
EndFunc


* program.exe например консольное приложение aka "ping 127.0.0.1 -l 1300 -n 100" после того как оно проделает свою работу закрывается и по циклу (бесконечному) открывается снова, и так бесконечно.

* При нажатии в трее Run ещё раз - запускается вторая копия program.exe и т.д. (третья, четвертая)

* При нажатии Exit нужно чтобы бесконечный цикл завершился, program.exe сам завершит свою работу
 

uritalex

Новичок
Сообщения
197
Репутация
3
Как то спрашивал как это реализовать :smile: Вот рабочий код, использую его уже давно:
Код:
Opt("TrayOnEventMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 2)

Global $Stop = False

TrayCreateItem("Выход из цикла")
TrayItemSetOnEvent(-1, "Stop")

While 1 ; главный цикл приложения
  ConsoleWrite("Вход в цикл" & @CRLF)
  Do
    ; цикл из которого нужно выйти
    Sleep(300)
  Until $Stop
  $Stop = False
  ConsoleWrite("Выход из цикла" & @CRLF)
WEnd

Func Stop()
  $Stop = True
EndFunc

Усли цикл большой то нужно поразпихивать по коду это:
Код:
If $Stop Then ExitLoop

Этот код был предложен уважаемым InnI
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
bobuni сказал(а):
ММ, наверное не правильно объяснил.

Код:
Func program()
While 1
RunWait("program.exe")
WEnd
EndFunc
Вот так сделайте, замените RunWait этим:
Код:
Func program()
While 1
$PID = Run("program.exe")
While ProcessExists($PID)
;...
If $stop Then ExitLoop 2
Sleep(10)
WEnd
WEnd
EndFunc
 
Автор
B

bobuni

Новичок
Сообщения
9
Репутация
0

во, уже больше похоже на то, что нужно.
в итоге вот что получилось

Код:
Opt("TrayMenuMode",3)
#Include <File.au3>

$runitem  = TrayCreateItem("Run")
TrayCreateItem("")
$exititem = TrayCreateItem("Exit")
TraySetState()

While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = 0
            ContinueLoop
        Case $msg = $runitem
			program()
        Case $msg = $exititem
            ExitEvent()
    EndSelect
WEnd

Func program()
While 1
;~ потовторять начало	
randomz()
$PID = Run('"' & @ScriptDir & '\programm.exe" -n "' & $number & '" http://"' & $addr & '"')
;~ повторять конец		
While ProcessExists($PID)
If $exititem Then ExitLoop 2
Sleep(10)
WEnd
WEnd
EndFunc

Func ExitEvent()
    Exit
 EndFunc

Func randomz()
Global $File = "addr.txt"
Global $addr = FileReadLine($File, Random(1, _FileCountLines($File), 1))
Global $number = Random(1, 20, 1)
EndFunc


только вот повторятся цикл не хотит
 
Верх