Fortschritt bei Progressbar

Für allgemeine Fragen zur Programmierung mit PureBasic.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Fortschritt bei Progressbar

Beitrag 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.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Fortschritt bei Progressbar

Beitrag 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?
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: Fortschritt bei Progressbar

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
kmais
Beiträge: 45
Registriert: 09.02.2017 13:54

Re: Fortschritt bei Progressbar

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Fortschritt bei Progressbar

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten