Es kommt öfter mal vor, dass ich kleine PB-Programme schreibe, die irgendwas simulieren, dafür sehr lange rechnen und zwischendurch mal was ausgeben sollen, gerne in ListViews. Dafür hänge ich unten ein (inhaltlich sinnloses) Beispiel an.
Nun ist es so, das derartige Ausgaben mitten in der Berechnung erst am Ende gebündelt angezeigt werden, was sicher daran liegt, dass die Berechnung das Eventhandling blockiert. Das könnte man sicher umgehen, indem man die Berechnung selbst als Thread startet und die gewollten Ausgaben als Event an das Hauptprogramm gibt.
Was aber grundsätzlich auch funktioniert (jedenfalls meistens), sind die beiden Zeilen, die ich unten in Prot eingefügt habe (Delay + WindowEvent).
Klappt (bei mir) nicht zuverlässig mit Delay(1), aber Delay(10) geht meistens.
Ich verstehe auch nicht, warum das funktioniert. Delay (das ja eine Wirkung hat) alleine geht nicht, und mit dem WindowEvent mache ich ja gar nichts.
Also meine Fragen :
Warum bewirkt Delay / WindowEvent kombiniert, dass die beiden Ausgaben im Beispiel live kommen, und nicht die erste zeitverzögert?
Wie macht man das besser?
Hier das Beispiel :
Code: Alles auswählen
EnableExplicit
Enumeration
#WinMain
#GAD_List
#GAD_Button
EndEnumeration
Procedure Prot(s.s)
Protected.i event
AddGadgetItem(#GAD_List,-1,s)
SetGadgetState(#GAD_List,CountGadgetItems(#GAD_List)-1)
;redraw ermöglichen :
Delay(10)
event=WindowEvent()
EndProcedure
Procedure.i Doit()
Protected.i i,n,zeit, tempzeit
Protected.i event
Dim dummy.i(100)
;ausgabe 1
Prot("los gehts")
;zeit verbrauchen
zeit=0
n=0
While zeit<3000
tempzeit=ElapsedMilliseconds()
For i=1 To 10000
RandomizeArray(dummy())
Next
n=n+10000
zeit=zeit+ElapsedMilliseconds()-tempzeit
Wend
;ausgabe 2
Prot("n="+Str(n))
EndProcedure
If OpenWindow(#WinMain, 1000, 0, 1000, 1000, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(#GAD_List,10,10,900,900)
ButtonGadget(#GAD_Button,10,910,150,50,"Go!")
Define.i Event
Repeat
Event=WindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #GAD_Button : Doit()
EndSelect
EndSelect
Delay(1)
Until Event = #PB_Event_CloseWindow
EndIf