Seite 1 von 1
Fortschritt bei Progressbar
Verfasst: 28.01.2020 14:22
von kmais
hallo, Leute ....
Code: Alles auswählen
OpenWindow(0,100,100,400,200,"Test Progressbar")
ProgressBarGadget(1,50,50,250,50,0,100)
ButtonGadget(2,50,150,50,25,"klick mich")
Procedure zaehle()
For i=0 To 100
Delay(10)
SetGadgetState(1,i)
Next
EndProcedure
Repeat
event=WaitWindowEvent()
If EventGadget()=2
If EventType()=#PB_EventType_LeftClick
zaehle()
EndIf
EndIf
Until event=#PB_Event_CloseWindow
Warum zeigt mir die Bar keinen laufenden Fortschritt?
Oder muss ich die Zuweisung an die Bar wirklich in einen eigenen Thread packen? Das wäre ja irre aufwendig.
Re: Fortschritt bei Progressbar
Verfasst: 28.01.2020 14:32
von kmais
Ich muss noch erwähnen, ich nutze Linux Mint 18 LXDE mit subsystem gtk2.
Eben mal mit Win 7 getestet, kein Problem.
Müsste also wohl etwas mit Linux zu tun haben.
Fällt jemanden etwas dazu ein?
Re: Fortschritt bei Progressbar
Verfasst: 28.01.2020 14:44
von #NULL
Das SetGadgetState() wirkt sich erst aus wenn alle Events zwischendurch auch verarbeitet werden. Also entweder du benutzt Custom Events und/oder Timer Events und/oder einen Thread. Ich denke aber SetGadgetState() aus dem Thread aufzurufen ist auch nicht richtig, sondern du müsstest aus dem Thread einen Custom Event erzeugen und dann auf diesen Event im Hauptthread in der Eventloop reagieren und SetGadgetState() dort aufrufen.
Das hat bei mir allerdings auch nicht richtig funktioniert:
https://www.purebasic.fr/english/viewto ... 13&t=71212
Re: Fortschritt bei Progressbar
Verfasst: 28.01.2020 14:50
von kmais
Danke für die schnelle Antwort.
Soweit habe ich's verstanden.
Aber ... warum funktioniert es unter Windows problemlos? Und eben mal mit qt als Subsystem getestet - da gehts auch.
Aber qt ist mir noch zu anfällig.
Re: Fortschritt bei Progressbar
Verfasst: 28.01.2020 14:51
von mk-soft
1. Man darf nicht die Event Schleife (WaitWindowEvent) unterbrechen, da sonst die GUI nicht mehr aktualisiert wird.
2. Man darf GUI-Element nicht aus Threads ändern, da diese zum Absturz führt. (Unter Windows geht es teilweise)
3. Man kann diese mit PostEvent lösen. (Siehe Modul
ThreadToGUI)
P.S. Siehe auch
Mini Thread Control
Beispiel mit Thread und PostEvent
Update 2
Code: Alles auswählen
;-TOP
Enumeration CustomEvent #PB_Event_FirstCustomValue
#MyEvent_Progress
EndEnumeration
Global thread
Procedure zaehle(*Thread.integer) ; <- Parameter Pointer auf Thread Variable
For i=0 To 100
Delay(10)
PostEvent(#MyEvent_Progress, 0, 1, 0, i)
Next
*Thread\i = 0 ; <- Eigene Thread Variable auf NULL setzen
EndProcedure
OpenWindow(0,100,100,400,200,"Test Progressbar")
ProgressBarGadget(1,50,50,250,50,0,100)
ButtonGadget(2,50,150,50,25,"klick mich")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget()=2
If EventType()=#PB_EventType_LeftClick
If Not thread
thread = CreateThread(@zaehle(), @thread) ; <- Pointer auf eigene Thread Variable übegeben
EndIf
EndIf
EndIf
Case #MyEvent_Progress
SetGadgetState(1, EventData())
EndSelect
ForEver