Что нового

Некорректная работа GUIGetMsg в циклах с большой задержкой

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Столкнулся с такой проблемой, при возникновении в цикле большой задержки, функция GUIGetMsg не возвращает нажатую кнопку.

Пример:
Код:
While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then ExitLoop
   Sleep( Random(5000,10000,1) )
WEnd


Есть предложения по исправлению?
AdlibRegister не вариант.
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
madmasles, Не совсем, вот более точнее;

Код:
$fk_timer = TimerInit()
Do
   $fk_challenge = UDPRecv($socket, 16384)
Until TimerDiff($fk_timer) >= 2000 Or $fk_challenge <> ""

Вот это находится в цикле, который по нажатию кнопки Stop нужно остановить.
И вот из-за этой задержки(в случае большого пинга) сообщение из функции GUIGetMsg() не доходит.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Не вижу препятствий
Код:
While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then ExitLoop
   $fk_challenge = UDPRecv($socket, 16384)
WEnd
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
C2H5OH, Если пинг будет более 50, то функция UDPRecv вернет "".
А в моем случае пинг всегда более 50.
И это цикл в цикле(останавливать нужно не этот, а общий).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
В таких случаях лучше использовать режим GUISetOnEvent, а не GUIGetMsg.
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
CreatoR, Я конечно думал об этом, но используется дочернее окно. А в вашем примере(через поиск находил) - написано, что в дочернем лучше всего использовать GUIOnEventMode = 0 во избежании ошибок.
И насколько я знаю, GUISetOnEvent не имеет смысла при GUIOnEventMode = 0.
Верно?

P.S. http://autoit-script.ru/index.php/topic,3925.msg40064/topicseen.html#msg40064



Добавлено:
Сообщение автоматически объединено:

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
firex [?]
в вашем примере(через поиск находил) - написано, что в дочернем лучше всего использовать GUIOnEventMode = 0 во избежании ошибок
Где это написано?

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


Добавлено:
Сообщение автоматически объединено:

firex [?]
Решил проблему, правда не совсем красиво получилось.
В каждый подцикл добавил получение сообщения от кнопки.
GUIGetMsg содержит в себе задержку в 10 мс.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
firex
Дочерние окна без труда делаются в любых режимах GUIOnEventMode. И даже можно комбинировать, например, если GUIOnEventMode=1, но при этом не хочется городить кучу функций и выносить переменные идентификаторов элементов в глобальные от дочернего окна, то временно перед созданием дочернего окна переключить режим в 0, а после закрытия включить в 1. Хотя я имею ввиду дочернее окно, которое блокирует основное перед вызовом.
 
Верх