Hier noch eine Thread basierte Lösung:
Ich habe mal unterstellt, dass der Prozess schon so schnell wie möglich abgearbeitet werden soll.
Also die Schleife (der wirkliche Prozess) wird in einen Thread ausgelagert.
Mit Hilfe eines Timers wird immer mal wieder (siehe Timeout Werte) der aktuelle Zählerstand angezeigt.
Den Rest findest Du vllt. selbst heraus.
Code: Alles auswählen
EnableExplicit
Global parent, csb
Structure TThread
Counter.i
;
Thread.i
bTerminate.i
EndStructure
Global ThreadParam.TThread
Procedure Counter_WorkerThread(*Param.TThread)
Protected i
Debug #PB_Compiler_Procedure + " start "
For i = 0 To 50000
*Param\Counter = i
Delay(1)
If *Param\bTerminate = #True
Debug #PB_Compiler_Procedure + " say good bye "
Break
EndIf
Next
Debug #PB_Compiler_Procedure + " done "
EndProcedure
parent = OpenWindow(#PB_Any, 0, 0, 500, 100, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
csb = CreateStatusBar(#PB_Any, WindowID(parent))
If csb
AddStatusBarField(250)
AddStatusBarField(#PB_Ignore)
EndIf
; For i = 0 To 50000
; StatusBarText(csb, 0, "Zähler = "+Str(i))
; Next
ThreadParam\Thread = CreateThread(@Counter_WorkerThread(), @ThreadParam)
AddWindowTimer(parent, 0, 10) ; fastest possible interval
AddWindowTimer(parent, 1, 50) ; this is flickerfree on my computer
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
ThreadParam\bTerminate = #True
If WaitThread(ThreadParam\Thread, 3000) = 0
Debug "Kill thread now...."
KillThread(ThreadParam\Thread)
EndIf
Break ; End
Case #PB_Event_Timer
Select EventTimer()
Case 0
StatusBarText(csb, 0, "Zähler = " + Str(ThreadParam\Counter))
Case 1
StatusBarText(csb, 1, "Zähler = " + Str(ThreadParam\Counter))
EndSelect
EndSelect
ForEver
RemoveWindowTimer(parent, 0)
RemoveWindowTimer(parent, 1)