﻿id	summary	reporter	owner	description	type	status	milestone	component	version	severity	resolution	keywords	cc
1862	GUISetOnEvent should behave more like HotKeySet()	anonymous		"What I mean is this little snippet from the help file for HotKeySet: 

{{{
A hotkey-press *typically* interrupts the active AutoIt function/statement and runs its user function until it completes or is interrupted. Exceptions are as follows:
1) If the current function is a ""blocking"" function, then the key-presses are buffered and execute as soon as the blocking function completes. MsgBox and FileSelectFolder are examples of blocking functions. Try the behavior of Shift-Alt-d in the Example.
2) If you have paused the script by clicking on the AutoIt Tray icon, any hotkeys pressed during this paused state are ignored.
}}}

What I get out of this If the script is processing 'loop' than a GUISetOnEvent user function is treated *always* as blocking so it is buffered and called after the 'loop' finishes (which in case of our example, it will take a long time) If we press a hotkey then that user function is checked if it is blocking, if it is not blocking than it is called right away.

I believe GUISetOnEvent should behave more like HotKeySet() in this regard.


Messy messy example
{{{
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

Global $iOperationRun = False

$hMain = GUICreate(""Example"", 170, 153, 231, 205)
$gcProgressMain = GUICtrlCreateProgress(8, 8, 150, 16)
$gcProgressSub1 = GUICtrlCreateProgress(8, 24, 150, 16)
$gcProgressSub2 = GUICtrlCreateProgress(8, 40, 150, 16)
$gcProgressText = GUICtrlCreateLabel(""Ready"", 8, 64, 150, 17)
$gcStartStop = GUICtrlCreateButton(""Start"", 40, 88, 75, 25, $WS_GROUP)
GUICtrlSetTip($gcStartStop, ""Press me, if you dare"")
$gcExit = GUICtrlCreateButton(""Exit"", 40, 120, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)

Opt(""GUIOnEventMode"", 1)

HotKeySet(""{esc}"", ""Quit"")
GUISetOnEvent($GUI_EVENT_CLOSE, ""Quit"")
GUICtrlSetOnEvent($gcExit, ""Quit"")

HotKeySet(""{f1}"", ""HotKeyEvent"")
GUICtrlSetOnEvent($gcStartStop, ""ButtonPressEvent"")


;.....
HotKeySet(""{F2}"", ""I_Will_NOT_Interupt"")
HotKeySet(""{F3}"", ""I_WILL_Interupt"")
Func I_Will_NOT_Interupt()
	ConsoleWrite(""{f2} I will politely say that you pressed me"" &@lf)
EndFunc
Func I_WILL_Interupt()
	While 1
		If $iOperationRun = False Then ExitLoop
		Sleep(10)
		ConsoleWrite(""How rude!, All your cpu cycles are belong to me"" &@lf)
	WEnd
EndFunc


While 1
	Sleep(10)
WEnd


Func HotKeyEvent()
	If WinActive($hMain) Then OperationManager()
EndFunc


Func ButtonPressEvent()
	OperationManager()
EndFunc

Func OperationManager()
	If $iOperationRun = True Then
		GUICtrlSetData($gcProgressText, ""Stopped"")
		GUICtrlSetData($gcStartStop, ""Start"")
		GUICtrlSetTip($gcStartStop, ""Press me, if you dare"")
		$iOperationRun = False
	Else
		GUICtrlSetData($gcProgressText, ""Doing stuff.."")
		GUICtrlSetData($gcStartStop, ""Stop"")
		GUICtrlSetTip($gcStartStop, ""I can't be stopped!! unless you press F1, or ESC ;)"")
		GUICtrlSetTip($gcExit, ""I can't be stopped!! unless you press F1, or ESC ;)"")
		$iOperationRun = True
		ProgressLoop()
	EndIf
EndFunc

Func Quit()
	Exit
EndFunc

Func ProgressLoop()
	Local $myCount = 0

	For $x = 1 To 10
		GUICtrlSetData($gcProgressMain, ($x / 10 * 100))
		For $y = 1 To 40
			If $iOperationRun = False Then ExitLoop 2  ;try to quit as soon as possible

			Sleep(100)

			$myCount += 1  ; this value stays the same even when nonInterupting() is called, interesting.

			GUICtrlSetData($gcProgressSub1, ($y / 40 * 100))

			ConsoleWrite( $myCount &@lf)

			For $z = 1 To 80

				Sleep(10)
				GUICtrlSetData($gcProgressSub2, ($z / 80 * 100))
				If $iOperationRun = False Then ExitLoop 3  ;try to quit as soon as possible

			Next

			If $iOperationRun = False  Then ExitLoop 2 ;try to quit as soon as possible

		Next
		If $iOperationRun = False  Then ExitLoop ;try to quit as soon as possible

	Next
EndFunc
}}}
"	Feature Request	closed		AutoIt		None	Rejected	hotkeypress guisetonevent loop	
