Что нового

[Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции?

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Код:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			SaveParams()
			WorkingBot()
	EndSwitch
WEnd


Где SaveParams() и WorkingBot() имеют внутри себя бесконечные While и множество вложенных друг в друга функций. Как прекратить работу программы по нажатию на крестик???
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

Либо использовать GUIOnEventMode, либо так же вызывать GUIGetMsg() всех вложенных функциях. Можно еще так (если критична задержка, которую создает GUIGetMsg()):

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

GUICreate('MyGUI', 400, 400)
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
GUISetState()

While 1
	Sleep(100)
WEnd

Func WM_SYSCOMMAND($hWnd, $iMsg, $wParam, $lParam)
	Switch $wParam
		Case 0xF060 ; SC_CLOSE
			Exit
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

Вашего примера совсем не понял. Из русской справки вычитал вот такой:
Код:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)  ; Change to OnEvent mode 
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")
GUISetState(@SW_SHOW)

While 1
  Sleep(100)  ; Idle around
WEnd

Func OKButton()
  MsgBox(0, "GUI Event", "You pressed OK!")
EndFunc

Func CLOSEClicked()
  MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
  Exit
EndFunc


Только вот согласно логике того, что написано в справке когда я нажму "ОК" у меня сможет отрабатываться закрытие окна, однако это не происходит пока не закрою первый MsgBox, то есть пока полностью не выполнится функция OKButton() :blink:


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

Код:
Switch $nMsg
Case $GUI_EVENT_CLOSE
	Exit

Вставлять во все функции оказалось тоже плохой затеей, так как очень часто используется Sleep, иногда 10 минутный. Внутри тех бесконечных функций. Неужели нет никакой возможности закрыть приложение во время выполнения любой функции и цикла, а также sleep'a?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

MsgBox() - это диалоговое окно Windows, и оно приостанавливает работу скрипта. В чем проблема? Если нужно выход при любом раскладе, то сделайте свой собственный MsgBox().
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

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

Так значит Switch Case $GUI_EVENT_CLOSE в каждую функцию дописывать будет надо. А Sleep(600000) забить в цикл из 600 итераций со Sleep(1000) и проверкой $GUI_EVENT_CLOSE? Это лучшее решение??
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>

$hForm = GUICreate('Hello World', 200, 100)
GUICtrlCreateLabel('Hello world! How are you?', 30, 10)
$Button = GUICtrlCreateButton('OK', 70, 50, 60)
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $Button
			OKButton()
	EndSwitch
WEnd

Func OKButton()
	While 1
		ConsoleWrite('OK!' & @CR)
		Sleep(1000)
	WEnd
EndFunc   ;==>OKButton

Func WM_SYSCOMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
        Case 0xF060 ; SC_CLOSE
            Exit
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Re: [Окна, Диалоги] Как заставить работать Case $GUI_EVENT_CLOSE во время выполнения другой функции

OffTopic:
Я восхищен вашими знаниями! И своим озарением по этому топику :laugh:
 
Верх