Что нового

[Автоматизация] Как избежать зависания интерфейса при sleep-ах

maddoc

Новичок
Сообщения
48
Репутация
2
Заголовок немного не выражает сути проблемы.
Поскольку я только начинаю ковырять автоит, не могу понять, как сделать так, чтобы какая-либо функция выполнялась по кругу, и при этом я мог бы запустить другую функцию или остановить выполнение старой.
В моем варианте , после запуска скрипта, другие функции вызвать с интерфейса уже не возможно.
Тоесть.
У меня есть скрипт который делает проверку приложений раз в 15 минут. И как раз эти 15 минут он лежит в SLeep.


Вообщем, когда выполняется кака-я либо функция, пока она не выполнится, интерфейс запуска скрипта как бы умирает, точнее запустить что либо еще невозможно.

Да даже закрыть его невозможно, клик на крестик ничего не дает, так же как и кнопка выхода из скрипта ( она работает до тех пор пока не запустилась какая либо функция рассчитанная на повторение ххх раз. )

Интерфейс сделан по принципу

Opt("GUIOnEventMode", 1)

и нажатие кнопок вызывает определенные функции. До тех пор пока не запускаю функцию проверки каждые 15 минут.

Need help вообщем ) Я видимо что-то недопонял, или как-то неправильно делаю паузы между циклами проверки.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
maddoc
Приведите пример вашего скрипта. Так будет нагляднее.
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
1300 + строчек кода.
Вообщем все отлично работает пока я не зацикливаю задачу. Оно и потом отлично работает, просто интерфес не реагирует на команды более )
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Можно попробывать запускать некоторые функции через:
Код:
AdlibRegister
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
maddoc
Кажется, CreatoR приводил пример одновременной работы двух функций:
Код:
#include <GUIConstantsEx.au3>
;

Opt("GUIOnEventMode", 1)

Global $ahCallBack[2], $iPrecent

$hGUI = GUICreate("ProgressBar", 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

$Progress = GUICtrlCreateProgress(10, 10, 300, 22)
$Status_Label = GUICtrlCreateLabel("0%", 330, 30, 30, 20)

$Button = GUICtrlCreateButton("Start",150,100,50,20)
GUICtrlSetOnEvent(-1, "_Main_Events")

GUISetState()

While 1
    Sleep(100)

    If $iPrecent > 0 Then
        ;Тут мы вызываем нашу функцию
        Call("_SomeFunction_Proc")
    EndIf
WEnd

Func _Main_Events()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            _CallBack_Free($ahCallBack)
            Exit
        Case $Button
            If GUICtrlRead($Button) = "Stop" Then
                GUICtrlSetData($Button, "Start")
                _CallBack_Free($ahCallBack)
            Else
                GUICtrlSetData($Button, "Stop")
                $ahCallBack = _CallBack_Init("_SetProgress_Proc", 10)
            EndIf
    EndSwitch
EndFunc

Func _SomeFunction_Proc()
    While $iPrecent > 0
        Sleep(1000)
        MsgBox(0, "", "Наша функция работает на ряду с прогрессом :)... " & $iPrecent & @CRLF)
    WEnd
EndFunc

Func _SetProgress_Proc()
    $iPrecent += 1

    GUICtrlSetData($Progress, Round($iPrecent / 3))
    GUICtrlSetData($Status_Label, Round($iPrecent / 3) & "%")

    If $iPrecent > 300 Then
        $iPrecent = 0

        GUICtrlSetData($Status_Label, "100%")
        GUICtrlSetData($Button, "Start")
        _CallBack_Free($ahCallBack)

        $ahCallBack = 0
        Dim $ahCallBack[2] = [-1, -1]
    EndIf
EndFunc

Func _CallBack_Init($sFuncName, $iTime, $sParam="")
    Local $hCallBack = DLLCallbackRegister($sFuncName, "int", $sParam)

    Local $aTimer = DllCall("user32.dll", "uint", "SetTimer", _
        "hwnd", 0, "uint", 0, "int", $iTime, "ptr", DllCallbackGetPtr($hCallBack))

    Local $ahCallBack[2] = [$hCallBack, $aTimer[0]]

    Return $ahCallBack
EndFunc

Func _CallBack_Free($ahCallBack)
    If $ahCallBack[0] <> -1 Then DllCallbackFree($ahCallBack[0])
    If $ahCallBack[1] <> -1 Then DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $ahCallBack[1])
EndFunc
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Функция обрабатывающая Event'ы не вызовется повторно, пока не закончит свою работу.

Вызывай функции из другого места, дав функции обработки Event'ов полностью завершиться.
 
Автор
M

maddoc

Новичок
Сообщения
48
Репутация
2
Код:
Func TestButton()
Local $iChekstime = ($iTimetochecks * 60000)
AdlibRegister("RunBotCheks", $iChekstime)
EndFunc
Func TestButton2()
AdlibUnRegister("RunBotCheks")
EndFunc

Вообщем все что требовалось , спасибо за подсказку куда смотреть.
Тема решена (как впрочем всегда )
 
Верх