i have a program with a very long running procedure, that is called by pressing a button (goButton).
how do i keep the window responsive and the cancel button functional?
in the demo the window freezes an cancel will not cancel or be reachable. thank you for any help and explanations in advance.
here a dumb demo
Code: Select all
EnableExplicit
Procedure Cleardummy()
Protected i.i, max=1000, d.i=0
For i = 0 To max
d+i
Next
EndProcedure
Procedure dummyInternal()
Protected i.i, max=100000, d.i=0
Protected j.i, max1=100, d1.i=0
For i = 0 To max
d+i
For j = 0 To max1
d1+j
Next
d1=0
Next
EndProcedure
Procedure.i readdemo(x = 0, y = 0, width = 436, height = 132)
Protected readdemo1, readnewevent, numfilesstring.s
Protected displaynumText, readProgressBar, goButton, CancelButton
Protected Iteration.i = 0, j.i = 100
Protected updated.i=0
readdemo1 = OpenWindow(#PB_Any, x, y, width, height, "readdemo", #PB_Window_SystemMenu)
If readdemo1
displaynumText = TextGadget(#PB_Any, 12, 38, 412, 16, "", #PB_Text_Center)
readProgressBar = ProgressBarGadget(#PB_Any, 12, 60, 412, 25, 0, 0)
goButton = ButtonGadget(#PB_Any, 12, 96, 152, 25, "Go")
CancelButton = ButtonGadget(#PB_Any, 272, 96, 152, 25, "Cancel", #PB_Button_Default)
SetGadgetText(displaynumText, "Insert " + Str(0) + " of "+ 0)
Repeat
readnewevent = WaitWindowEvent()
Select readnewevent
Case #PB_Event_CloseWindow
ProcedureReturn 0
Case #PB_Event_Gadget
Select EventGadget()
Case CancelButton
Break
Case goButton
DisableGadget(goButton, 1)
numfilesstring = Str(j)
SetGadgetAttribute(readProgressBar, #PB_ProgressBar_Maximum, j)
While updated <= j
Cleardummy()
dummyInternal()
Iteration + 1
SetGadgetText(displaynumText, "Insert " + Str(Iteration) + " of "+ numfilesstring)
SetGadgetState(readProgressBar, Iteration)
ResizeGadget(readProgressBar,#PB_Ignore,#PB_Ignore,#PB_Ignore,#PB_Ignore)
updated+1
Wend
EndSelect
EndSelect
ForEver
EndIf
CloseWindow(readdemo1)
ProcedureReturn Iteration
EndProcedure
readdemo()
End