Что нового

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

snoitaleR

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

CreatoR

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

snoitaleR

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

Yashied

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

snoitaleR

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

Yashied

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

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


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

snoitaleR

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,717
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,763
Репутация
1,153
При использовании некоторых WM-сообщений заметил, что когда мышь проходит над интерфейсом программы счётчик событий ускоряется в 10 раз. Почему то я решил что режим OnEvent является нативным и имеет тот же принцип - замедлять скорость опроса событий от Gui, если к примеру программа свёрнута, неактивна или мышь не двигается.
Кто нибуть в курсе? Я многие утилиты, которые писал тотально переводил на режим OnEvent, учитывая что количество опрашиваемых элементов интерфейса постоянно увеличивается.
 
Верх