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