Что нового

[Элементы GUI] MessageLoop vs OnEvent

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Подскажите, пожалуйста, является ли режим GUI OnEvent универсальным с точки зрения функциональности?
Если я правильно понял, то режим MessageLoop используют только с целью упрощения скриптов?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 159
Репутация
2 329
Это всё зависит от поставленной задачи. Иногда лучше использовать MessageLoop (например если некие элементы вызывают дочернее окно которое также требует обработку событий), а иногда лучше OnEvent. Хотя если граммотно составить обработку, то оба способа можно использовать как универсальные :smile:.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
Я замечал, что некоторые специфические манипуляции (к примеру, реакция на выбор из списка комбобокса) выполняются только в режиме OnEvent, поэтому усомнился в функциональности MessageLoop...
Так ли это?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Лично я OnEvent использовал всего один раз, и мне не понравилось. :smile:
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Yashied
А я, наоборот, собирался пожертвовать простотой во имя функциональности...
Я думаю, если привыкнуть к режиму OnEvent, то он не будет казаться таким уж сложным, был бы резон...
Поэтому решил создать данную тему, чтобы услышать мнения других скриптеров...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Он вовсе не сложный, скорее наоборот. Вся сложность заключается в том, что при некоторых задачах тебе придется контролировать моменты прихода событий от GUI, в то врямя, как в цикле это можно легко предусмотреть последовательностью действий. Например:

Код:
While 1
	$Msg = GUIGetMsg()
	
	...
	
WEnd


В этом случае события "приходят" строго в определенном месте программы. Во многих ситуациях это жизненно необходимо. А в OnEvent режиме прерывание может прийти в любом месте цикла, и тебе придется это учитывать. Мой совет - используй OnEvent только там где это действительно необходимо (сам поймешь когда это понадобится). По умолчанию работай с циклом.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
И последний, наверное, вопрос:
все-таки, можно ли реализовать реакцию на выбор из списка комбобокса в режиме MessageLoop? Не обязательно пример, хотя бы идею...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
snoitaleR сказал(а):
CreatoR
Я замечал, что некоторые специфические манипуляции (к примеру, реакция на выбор из списка комбобокса) выполняются только в режиме OnEvent, поэтому усомнился в функциональности MessageLoop...
Так ли это?
Код:
#Include <GUIConstantsEx.au3>

GUICreate('MyGUI', 300, 200)
$Combo = GUICtrlCreateCombo('', 10, 10, 280, 21)
GUICtrlSetData(-1, 'Item1|item2|Item3', 'item1')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Combo
			MsgBox(0, 'Combo Event', GUICtrlRead($Combo))
	EndSwitch
WEnd


?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR, Yashied
Спасибо за помощь...
Теперь я гораздо лучше представляю, как выбирать режим GUI...
 

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
При использовании некоторых WM-сообщений заметил, что когда мышь проходит над интерфейсом программы счётчик событий ускоряется в 10 раз. Почему то я решил что режим OnEvent является нативным и имеет тот же принцип - замедлять скорость опроса событий от Gui, если к примеру программа свёрнута, неактивна или мышь не двигается.
Кто нибуть в курсе? Я многие утилиты, которые писал тотально переводил на режим OnEvent, учитывая что количество опрашиваемых элементов интерфейса постоянно увеличивается.
 
Верх