Что нового

В каких случаях лучше применять MessageLoop, а в каких OnEvent ?

kyi

Новичок
Сообщения
43
Репутация
0
Добрый день!
Перечитал все что смог найти, но понял не многое. Объясните, для чего есть два режима обработки событий MessageLoop и OnEvent?
В каких случаях, при каких условиях лучше применять тот или иной режим?
В AutoIT по умолчанию используется MessageLoop.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
русская справка
там подробно описано
ну и в оригинальной с переводчиком можно прочитать
 
Автор
K

kyi

Новичок
Сообщения
43
Репутация
0
Читал я эту справку и как раз после нее и обратился на форум.
В справке написано как это работает, а потом говорят, что метод выбирайте сами. Как я выберу сам если даже не дали примеров.
Хотя бы описали, что MessageLoop лучше применять в таких-то и таких-то ситуациях потому , что....
а OnEvent в других, потому что....
Но нет, не написали.
Какой мне смысл знать что OnEvent это обработка по событию, а MessageLoop это обработка событий в цикле. Я три недели читаю разные справки, форум и вопросов все больше и больше, а ответов меньше и меньше.
Вот вы когда применяете MessageLoop, а когда OnEvent и почему?
 
A

Alofa

Гость
kyi
Да не парьтесь вы так. Расслабьтесь, вздохните глубоко, сделайте перерыв.
Используйте "MessageLoop" и радуйтесь жизни, а вот когда вам понадобиться другой режим вы поймете, обязательно поймете с опытом.
Запомните одно: Работающий скрипт это всегда движение, а где оно будет происходить в функции или цикле это уже решать вам.

Сравните работу этих двух однотипных примеров:
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Local $iTime = 0, $iSleep = 0
$hGui = GUICreate('Режим MessageLoop (Цикл опроса GUI)', 400, 150, -1, 100, $WS_OVERLAPPEDWINDOW, $WS_EX_COMPOSITED)
$iLabel = GUICtrlCreateLabel('0', 10, 20, 380, 80, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 107 - 40)
GUICtrlSetBkColor(-1, 0xFFFED8)
$iButt = GUICtrlCreateButton('Вставить Sleep(600)', 120, 110, 150, 30)
GUISetState()

While 1
	$iTime += 1
	GUICtrlSetData($iLabel, $iTime)
	Sleep(50 + $iSleep) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
	Switch GUIGetMsg()
		Case $iButt
			If $iSleep Then
				$iSleep = 0
			Else
				$iSleep = 550
				MsgBox(262144 + 64, Default, 'Попробуйте закрыть окно или нажать кнопку', 2, $hGui)
			EndIf
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt('GUIOnEventMode', 1)

Local $iTime = 0, $iSleep = 0
$hGui = GUICreate('Режим OnEvent (по событию)', 400, 150, -1, 100, $WS_OVERLAPPEDWINDOW, $WS_EX_COMPOSITED)
$iLabel = GUICtrlCreateLabel('0', 10, 20, 380, 80, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 107 - 40)
GUICtrlSetBkColor(-1, 0xFFFED8)
$iButt = GUICtrlCreateButton('Вставить Sleep(600)', 120, 110, 150, 30)
GUICtrlSetOnEvent($iButt, '_Button')
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
GUISetState()

While 1
	$iTime += 1
	GUICtrlSetData($iLabel, $iTime)
	Sleep(50 + $iSleep) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
WEnd

Func _Button()
	If $iSleep Then
		$iSleep = 0
	Else
		$iSleep = 550
		MsgBox(262144 + 64, Default, 'Попробуйте закрыть окно или нажать кнопку', 2, $hGui)
	EndIf
EndFunc   ;==>_Button

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
я так подозреваю, что следующим вопросом будет
"Что лучше использовать: Switch или Select"?



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

kyi [?]
В справке написано как это работает, а потом говорят, что метод выбирайте сами
я редко пользуюсь режимом EventMod. Но его можно включить по ходу работы скрипта, и тогда можно отключить некоторые элементы, а другим назначить иные функции. А потом вернуть все обратно.
Alofa точно сказал, что с опытом появится и понимание где и что лучше применять. Во многих случаях MsgLoop достаточно
Пример комбинации режимов
Код:
#include <GUIConstantsEx.au3>

Global $hGui = GUICreate('Режимы MessageLoop и EventMod', 400, 150, -1, -1)
Global $iButt = GUICtrlCreateButton('Включить EventMod', 150, 50, 150, 30)
Local $iButt1 = GUICtrlCreateButton('Кнопка1', 10, 10, 80, 30)
Local $iButt2 = GUICtrlCreateButton('Кнопка2', 10, 50, 80, 30)
Local $iButt3 = GUICtrlCreateButton('Кнопка3', 10, 90, 80, 30)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $iButt1
			MsgBox(64, '', 'Работаю только в режиме GuiMsg', 0, $hGui)
		Case $iButt
				Opt("GUIOnEventMode", 1)
				GUICtrlSetData($iButt, 'Выключить EventMod')
				GUICtrlSetOnEvent($iButt, '_Evfunc')
				GUICtrlSetOnEvent($iButt2, '_BT1')
				GUICtrlSetOnEvent($iButt3, '_AllMod')
				GUISetOnEvent($GUI_EVENT_CLOSE, '_Close')
				MsgBox(64, '', 'Режим EventMod включен' & @CRLF & 'Работаю в обоих режимах', 0, $hGui)
		Case $iButt3
			MsgBox(64, '', 'Работаю в режиме GuiMsg' & @CRLF & 'Выполняю функцию номер 1', 0, $hGui)
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Evfunc()
	Opt("GUIOnEventMode", 0)
	GUICtrlSetData($iButt, 'Включить EventMod')
	MsgBox(64, '', 'Режим EventMod выключен' & @CRLF & 'Работаю в обоих режимах', 0, $hGui)
EndFunc   ;==>_Evfunc

Func _BT1()
	MsgBox(64, '', 'Работаю только в режиме EventMod', 0, $hGui)
EndFunc   ;==>_BT1

Func _AllMod()
	MsgBox(64, '', 'Работаю в режиме EventMod' & @CRLF & 'Выполняю функцию номер 2', 0, $hGui)
EndFunc   ;==>_AllMod

Func _Close()
	MsgBox(64, '', 'Закрытие программы в режиме EventMod', 0, $hGui)
	Exit
EndFunc   ;==>_Close
 
Автор
K

kyi

Новичок
Сообщения
43
Репутация
0
Alofa сказал(а):
Сравните работу этих двух однотипных примеров:
Сравнил. Как по мне, то OnEvent вроде нагляднее (правда пока я мало что понимаю)
Хорошо, тогда еще один глупый вопрос
Есть ли заметная разница в скорости работы между OnEvent и MessageLoop?
Просто у меня логика такая, т.к. MessageLoop это непрерывный цикл, то при работе в этом режиме программа постоянно задействует ресурсы железа. В режиме OnEvent программа стоит и ждет. Поэтому, как мне кажется, MessageLoop более требователен к ресурсам или я не прав?
 
Верх