Что нового

В чем разница MessageLoop и OnEvent

winkot

Новичок
Сообщения
190
Репутация
0
В чем разница MessageLoop и OnEvent ? Сделал два скрипта:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#Region (=== GUI generated by GuiBuilderPlus 1.3.0 ===)
Global $hGUI = GUICreate("MyGUI", 400, 350, 771, 302)

Global $Button_1 = GUICtrlCreateButton("Кнопка 1", 120, 160, 161, 41)
GUICtrlSetFont(-1, 15)
Global $Button_2 = GUICtrlCreateButton("Кнопка 2", 120, 239, 161, 41)
GUICtrlSetFont(-1, 15)
#EndRegion (=== GUI generated by GuiBuilderPlus 1.3.0 ===)


GUISetState(@SW_SHOWNORMAL)

While 1
    Switch GUIGetMsg()

        Case $Button_1
            Sleep(5000)
            Beep(500, 200)
        Case $Button_2
            Beep(1000, 100)
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd



И

Код:
Opt("GUIOnEventMode", 1)

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#Region (=== GUI generated by GuiBuilderPlus 1.3.0 ===)
Global $hGUI = GUICreate("MyGUI", 400, 350, 771, 302)
Global $Button_1 = GUICtrlCreateButton("Кнопка 1", 120, 160, 161, 41)
GUICtrlSetFont(-1, 15)
Global $Button_2 = GUICtrlCreateButton("Кнопка 2", 120, 239, 161, 41)
GUICtrlSetFont(-1, 15)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUICtrlSetOnEvent($Button_1, "Func1")
GUICtrlSetOnEvent($Button_2, "Func2")


#EndRegion (=== GUI generated by GuiBuilderPlus 1.3.0 ===)

    GUISetState(@SW_SHOWNORMAL)

While 1
  Sleep(100)
WEnd

Func Func1()
   Sleep(5000)
  Beep(500,200)
EndFunc

Func Func2()
  Beep(1000,100)
EndFunc


Func _Exit()
    GUIDelete()
    Exit
EndFunc   ;==>_Exit


Оба ведут себя одинаково. Когда нажимаю Кнопку 1, то пока не отработается ее функция, функция Кнопки 2 не срабатывает. И чем же тогда отличаются эти два режима?
 

damien2008

Осваивающий
Сообщения
190
Репутация
34
в GUICtrlSetOnEvent нельзя использовать передачу параметров, только название ф-ии.

GUIGetMsg возвращает событие, или массив с дополнительными параметрами:
- 0, ид события, ид контрола
- хендл окна
- хендл контрола
- координаты миши

они взимоисключаемы в зависимости от режима GUIOnEventMode.
 

Norm

Продвинутый
Сообщения
291
Репутация
76
Если бы это было так, то зачем он тогда нужен OnEvent ?
Всё там есть и все параметры тоже можно получить. Просто реализовано по другому.
Почитаите справку, там ни слова нету, что там что-то не делается как с GUIGetMsg.
Для небольших проэктов действительно проще использощать GUIGetMsg.
В своём проэкте, который уже пятый год разрабатываю, я был вынужден использовать OnEvent.
Есть конечно маленькие неудобства, но в остальном только приемущества. Гибкость кода, на мой взгляд лучше, и
самое главное, не нужно беспокоится о постоянно распухающем While, от которого снижается скорость опроса GUI.
 
Последнее редактирование:

damien2008

Осваивающий
Сообщения
190
Репутация
34
GUIGetMsg
Polls the GUI to see if any events have occurred.
(Опрашивает графический интерфейс пользователя на предмет произошедших событий.)

GUICtrlSetOnEvent
Defines a user-defined function to be called when a control is clicked.
(Определяет пользовательскую функцию, которая будет вызываться при щелчке по элементу управления.)

>> не нужно беспокоится о постоянно распухающем While..
#include "[path\]filename"
#include <filename>

>> снижается скорость опроса GUI..
используйте GUIRegisterMsg
 

Norm

Продвинутый
Сообщения
291
Репутация
76
Это Вы просто предлагаете шило на мыло поменять.
Обработчик событий нужно использовать не для этого.
Для этого есть OnEvent (спасибо за подсказку, исправил) или MessageLoop.
 
Верх