Что нового

Выйти из цикла по кнопке

Fanatmb

Новичок
Сообщения
59
Репутация
0
Доброго дня.

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

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <TreeViewConstants.au3>
#include <GUIComboBox.au3>

Global $chk=0

_Main()
Exit

Func Logging(ByRef $idTEXT,$whinfo)
   
    local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   "
    local $editBefore = GuiCtrlRead($idTEXT)
    GUICtrlSetData($idTEXT, $cTime&" "&$whinfo&@CRLF&$editBefore& " ")
    ;$editBefore=""
   
EndFunc


Func Request(ByRef $idTEXT)
       
    $whinfo = "Есть инфа!"
    local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   "
    local $editBefore = GuiCtrlRead($idTEXT)
    GUICtrlSetData($idTEXT, $cTime&" "&$whinfo&@CRLF&$editBefore& " ")
    Sleep(3000)
     
EndFunc

Func _Main()

    Local $idInput_Date, $idInput_Time, $iMsg
    Local $idTEXT, $Combo1, $sList
    Local $nCh1, $nCh2, $nCh3, $nCh4, $nCh5, $nCh6, $msg
    Local $whinfo
    #forceref $idInput_Date, $idInput_Time

    GUICreate("Мониторинг", 500, 339, (@DesktopWidth - 500) / 2, (@DesktopHeight - 339) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_POPUP + $WS_EX_TOOLWINDOW)
    Opt("GUIResizeMode",802)
   
    Local $hWnd = WinGetHandle("[ACTIVE]")
    WinSetOnTop($hWnd, "", 1)

    GUICtrlCreateLabel("Что ищем?", 10, 12, 60, 20)

    $Combo1 = GUICtrlCreateCombo("", 70, 10, 100, 150, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_NOINTEGRALHEIGHT))
    GUICtrlSetData(-1, $sList , "") ; добавляет другие пункты и устанавливает новый по умолчанию
    GUICtrlSendMsg(-1, $CB_SETDROPPEDWIDTH, 370, 0) ; Ширина выпадающего списка
   
    $nCh1 = GUICtrlCreateCheckbox("Зима", 180, 10, 60, 20)
    $nCh2 = GUICtrlCreateCheckbox("Лето", 280, 10, 60, 20)


    Local $iOKButton = GUICtrlCreateButton("Старт", 380, 8, 60)


    ;GUICtrlCreateLabel("Время", 10, 240, 150, 20)
    ;$idInput_Time = GUICtrlCreateInput(""& @MON & "-" & @MDAY & "-" & @YEAR &"   " & @HOUR & ":" & @MIN & ":" & @SEC, 180, 240, 280, 20)
    $idTEXT = GUICtrlCreateEdit("", 30, 50, 420, 300, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
    GUICtrlSetTip(-1, "Мониторинг")
   

    GUISetState(@SW_SHOW)
   
    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
          Exit 
    Case $iOKButton
        if $chk = 0 Then
        GUICtrlSetData($iOKButton,"Стоп")
        $whinfo  = "Пошёл процесс!"
        Logging($idTEXT,$whinfo)
        $chk = 1
        Sleep(2000)
        While 1
            Request($idTEXT) ; вот тут запускается функция опроса данных и из неё надо как-то выйти
        WEnd

        else
        GUICtrlSetData($iOKButton,"Старт")
        $i=0
        $whinfo ="Мониторинг остановлен"
        Logging($idTEXT,$whinfo)
        $chk = 0
               ;MsgBox(4096, "Сообщение", "Мониторинг запущен",3)
       
        EndIf
        Case Else
    EndSwitch
    WEnd

EndFunc   ;==>_Main


Вот только после запуска Request в цикле не получается остановить эту задачу, да и принципе получается только "убив" процесс. Нужно иметь возможность остановить процесс, поставить требуемые галочки, из списка выбрать запросы (его пока нет, да и речь не о нём), и опять его запустить.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
600
Репутация
77
Нужно переписать код под OnEvent или не блокировать цикл опроса событий.
 
Автор
F

Fanatmb

Новичок
Сообщения
59
Репутация
0
Ткните носом плиз, как тут я его блокирую?
 

johnmarshall

Осваивающий
Сообщения
198
Репутация
38
while 1 ______\
request() _____} вот тут блокируете.
wend ________/

вам советуют использовать OnEvent mode вместо опроса GUI с GUIGetMsg.
OnEvent mode
 
Автор
F

Fanatmb

Новичок
Сообщения
59
Репутация
0
Спасибо, за наводку. Вот что получилось и работает. Не мудрёно выглядит?

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ComboConstants.au3>
#include <ButtonConstants.au3>
#include <TreeViewConstants.au3>
#include <GUIComboBox.au3>

Global $chk=0


Func Logging(ByRef $idTEXT,$whinfo)
    
    local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   " 
    local $editBefore = GuiCtrlRead($idTEXT) 
    GUICtrlSetData($idTEXT, $cTime&" "&$whinfo&@CRLF&$editBefore& " ")
    
EndFunc


Func Request()
    
        if $chk = 1 Then
         $whinfo = "Есть инфа!"
        local $cTime = @YEAR & "-" & @MON & "-" & @MDAY &"   " & @HOUR & ":" & @MIN & ":" & @SEC &"   " 
        local $editBefore = GuiCtrlRead($idTEXT) 
        GUICtrlSetData($idTEXT, $cTime&" "&$whinfo&@CRLF&$editBefore& " ")
        Sleep(3000) 
        else
            Exit
        EndIf
    
     
EndFunc

Func CLOSEClicked()
  Exit
EndFunc

Func OKButton()

        if $chk = 0 Then
        GUICtrlSetData($iOKButton,"Стоп")
        $whinfo  = "Пошёл процесс!"
        Logging($idTEXT,$whinfo)
        $chk = 1
        Sleep(1000)
        AdlibRegister ("Request",3000)
        else
        AdlibUnRegister ("Request")
        GUICtrlSetData($iOKButton,"Старт")
        $whinfo ="Мониторинг остановлен"
        Logging($idTEXT,$whinfo)
        $chk = 0 
        
        EndIf
EndFunc

Opt("GUIOnEventMode", 1)  ;
Local $mainwindow = GUICreate("Мониторинг", 469, 339, (@DesktopWidth - 469) / 2, (@DesktopHeight - 339) / 2, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_POPUP + $WS_EX_TOOLWINDOW)
    Opt("GUIResizeMode",802)
    Local $hWnd = WinGetHandle("[ACTIVE]")
    WinSetOnTop($hWnd, "", 1)
    GUISetState(@SW_SHOW, $mainwindow)

    GUICtrlCreateLabel("Что ищем?", 10, 12, 60, 20)

    Local $Combo1 = GUICtrlCreateCombo("", 70, 10, 100, 150, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_NOINTEGRALHEIGHT))
    ;GUICtrlSetData(-1, $sList , "") ; добавляет другие пункты и устанавливает новый по умолчанию
    GUICtrlSendMsg(-1, $CB_SETDROPPEDWIDTH, 370, 0) ; Ширина выпадающего списка
    
    Local $nCh1 = GUICtrlCreateCheckbox("Зима", 180, 10, 60, 20)
    Local $nCh2 = GUICtrlCreateCheckbox("Лето", 280, 10, 60, 20)

    Local $iOKButton = GUICtrlCreateButton("Старт", 380, 8, 60)

    local $idTEXT = GUICtrlCreateEdit("", 30, 50, 420, 300, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
    GUICtrlSetTip(-1, "Мониторинг")

    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    GUICtrlSetOnEvent($iOKButton, "OKButton")

while 1
    sleep(10)
wend
 

johnmarshall

Осваивающий
Сообщения
198
Репутация
38
мб. в Request() Sleep(3000) не нужен, AdlibRegister ("Request",3000) и так будет его вызывать каждые 3 сек.

вообще, честно говоря, имхо, на будущее, для дополнительных ф-й, которые вы хотите запускать как фоновые, или как дополнительные, типа, как отдельная ф-я, или паралельная, чтобы не мучатся с многопоточностью, и adlibregister, к-й на время его выполнения прерывает основную программу, т.е. в какой-то момент, вы столкнетесь с тем, что у вас окно не отвечает на события, или начинают появлятся непонятные "фризы", когда не нажимаются кнопки, и вы не будете знать где искать, если вы сейчас осваиваете автоит, я бы посоветовал использовать _Timer_SetTimer, для таких дел., но это опять, имхо, просто он проще именно в автоите, да и не только в нем, там конечно, есть свои нюансы, но это уже будет потом.
пока что посмотрите на варианты использования таймеров..
 
Автор
F

Fanatmb

Новичок
Сообщения
59
Репутация
0
Спасибо! Ну вроде как работает. И наверное Вы правы, но мне нужно сделать именно задержку перед первым запуском данной функции. а дальше идут веб-запросы с определенным интервалом.
 
Верх