corgano Posted June 9, 2015 Posted June 9, 2015 (edited) The scenario is thus: You have a button on a gui, and it does an action that takes some time - let's just assume it is a sleep(20000).The user clicks the button, the script does it's thing. HOWEVER if the user gets impatient and clicks the button again before it finishes, or if they spam the button, you will get an endless looping of the function over and over.Is there any way that if I had a function that took a while to run, and someone clicked the button to start/restart it again, that I could immediately kill/return the function instead of waiting for it to finnish? Or would there be a way to disable the gui from accepting and clicks or keystrokes until the current function finishes executing? My goal is to avoid the pressing the button twenty times impatiently making it do the same thing over and over. Edited June 9, 2015 by corgano 0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e
zreo15 Posted June 9, 2015 Posted June 9, 2015 maybe you can make the button change into a loading gif till the function is loading then turn it back
spudw2k Posted June 9, 2015 Posted June 9, 2015 (edited) There are a couple of ways that I have handled similar problems. One method is to disable any controls while your long process runs and then re-enable them when it is complete. Another method is to create some sort of global variable that denotes whether the program is busy and inspect the variable as funcs are called. I'm sure other folks have some good ideas as well.Some example code that demonstrates a specific scenario would give us more to work with. Edited June 9, 2015 by spudw2k Spoiler Things I've Made: Always On Top Tool ◊ AU History ◊ Deck of Cards ◊ HideIt ◊ ICU ◊ Icon Freezer ◊ Ipod Ejector ◊ Junos Configuration Explorer ◊ Link Downloader ◊ MD5 Folder Enumerator ◊ PassGen ◊ Ping Tool ◊ Quick NIC ◊ Read OCR ◊ RemoteIT ◊ SchTasksGui ◊ SpyCam ◊ System Scan Report Tool ◊ System UpTime ◊ Transparency Machine ◊ VMWare ESX Builder Misc Code Snippets: ADODB Example ◊ CheckHover ◊ Detect SafeMode ◊ DynEnumArray ◊ GetNetStatData ◊ HashArray ◊ IsBetweenDates ◊ Local Admins ◊ Make Choice ◊ Recursive File List ◊ Remove Sizebox Style ◊ Retrieve PNPDeviceID ◊ Retrieve SysListView32 Contents ◊ Set IE Homepage ◊ Tickle Expired Password ◊ Transpose Array Projects: Drive Space Usage GUI ◊ LEDkIT ◊ Plasma_kIt ◊ Scan Engine Builder ◊ SpeeDBurner ◊ SubnetCalc Cool Stuff: AutoItObject UDF ◊ Extract Icon From Proc ◊ GuiCtrlFontRotate ◊ Hex Edit Funcs ◊ Run binary ◊ Service_UDF
argumentum Posted June 9, 2015 Posted June 9, 2015 put this code at the point where you'd like to flush the clickingWhile GUIGetMsg() WEnd corgano 1 Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
Newb Posted June 9, 2015 Posted June 9, 2015 (edited) Fiddled a bit with GuiOnEventMode and GuiGetMsg but the only way I found was what they already told you, otherwise function will be quequed and called for each time you clicked.Use #include <GUIConstantsEx.au3> and when you call the function use GuiCtrlSetState($YourControl,$GUI_DISABLE) and when finished GuiCtrlSetState($YourControl,$GUI_ENABLE) Or tempoarily replace the button with something not clickable until the function ends. Edited June 9, 2015 by Newb I'm a compulsive poster. When I post something, come to read it at least 5 minutes later after the posting, because I will edit it. I edited even this signature a few minutes later after I wrote it.
corgano Posted June 13, 2015 Author Posted June 13, 2015 (edited) maybe you can make the button change into a loading gif till the function is loading then turn it back Considered this, but if the gui has a lot of buttons it becomes annoying to keep track of replacing / enabling and disabling controls.There are a couple of ways that I have handled similar problems. One method is to disable any controls while your long process runs and then re-enable them when it is complete. Another method is to create some sort of global variable that denotes whether the program is busy and inspect the variable as funcs are called. I'm sure other folks have some good ideas as well.Some example code that demonstrates a specific scenario would give us more to work with.I've also done something similar to this before, having a global flag to wuit doing whatever and every few lines check if the flag was set and if so return. This seemed excessively messy though, so I was wondering about a better solution. Here is an example script that shows the issue:expandcollapse popup#include <GUIConstantsEx.au3> #include <GuiImageList.au3> #include <GuiListView.au3> Example() Func Example() Local $hImage, $idListview ; Create GUI GUICreate("ListView Add Item", 400, 400) $idListview = GUICtrlCreateListView("", 2, 2, 394, 268) $button = GUICtrlCreateButton("go", 2,280,493,100) GUISetState(@SW_SHOW) ; Add columns _GUICtrlListView_InsertColumn($idListview, 0, "Column 1", 100) _GUICtrlListView_InsertColumn($idListview, 1, "Column 2", 100) _GUICtrlListView_InsertColumn($idListview, 2, "Column 3", 100) _GUICtrlListView_InsertColumn($idListview, 3, "Column 4", 100) _GUICtrlListView_InsertColumn($idListview, 4, "Column 5", 100) ; Add items longfunc($idListview) ; Loop until the user exits. while 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE GUIDelete() Exit Case $button longfunc($idListview) EndSwitch WEnd EndFunc ;==>Example Func longfunc($idListview) _GUICtrlListView_DeleteAllItems($idListview) For $i = 0 to 300 _GUICtrlListView_AddItem($idListview, "Row "&$i+1&": Col 1", $i) _GUICtrlListView_AddSubItem($idListview, $i, "Row "&$i+1&": Col 2", 1) _GUICtrlListView_AddSubItem($idListview, $i, "Row "&$i+1&": Col 3", 2) _GUICtrlListView_AddSubItem($idListview, $i, "Row "&$i+1&": Col 4", 3) _GUICtrlListView_AddSubItem($idListview, $i, "Row "&$i+1&": Col 5", 4) Next EndFuncput this code at the point where you'd like to flush the clickingWhile GUIGetMsg() WEnd That never would have occurred to me! actually functions really well, and as far as solutions to clearing any buffered keys this works brilliantly.Is there any good, simple solution like this for interrupting / stopping the running function immediately? Edited June 13, 2015 by corgano 0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e
argumentum Posted June 13, 2015 Posted June 13, 2015 Is there any good, simple solution like this for interrupting / stopping the running function immediately?code speak louder than words expandcollapse popup#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= Global $Form1 = GUICreate("my big GUI", 615, 49, -1, -1, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE)) Global $Button1 = GUICtrlCreateButton("Button1", 8, 8, 75, 25) Global $Label1 = GUICtrlCreateLabel("Label1", 88, 14, 500, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Global $bStop = False myTimeIsA_LongFunctionToStop() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete() Exit 0 Case $Button1 ; run again ? $bStop = Not $bStop myTimeIsA_LongFunctionToStop() EndSwitch WEnd Func myTimeIsA_LongFunctionToStop() While 1 ; run baby, run ; la la la ; la la la ; la la la If GUIGetMsg() = $Button1 Then $bStop = Not $bStop If $bStop Then GUICtrlSetData( $Label1 , "I'm stopped ?" ) Return "I'm stopped ?" ; place somethingt like this ? EndIf ; la la la ; la la la ; la la la ; la la la GUICtrlSetData( $Label1 , @HOUR&":"&@MIN&":"&@SEC&"."&@MSEC ) Sleep(10) ; la la la ; la la la ; la la la WEnd EndFunc Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now