[Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Berti
Beiträge: 3
Registriert: 14.05.2014 22:09

[Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Berti »

Hallo
Ich hoffe, mein erster Eintrag erregt hier kein Ärgernis, aber ich habe da mit dem Progressbar auf nunmehr 3 unterschiedlichen Rechnern dasselbe Erscheinungsbild. Doch zunächst die Standardangaben:

PB-Version: PureBasic 5.22 LTS (Windows - x64)
OS: Windows 7 64 Bit Professional (2x sowie 1x auf Home)
Compilereinstellungen:
[x] Unicode-Executable erstellen
[ ] Thread-sicheres Executable erstellen
[ ] OnError-Unterstützung einschalten
[x] Moderne Themen-Unterstützung aktivieren (für Windows XP und höher)
[ ] Administrator-Modus für Windows Vista und höher anfordern
[ ] User-Modus für Windows Vista und höher anfordern (keine Virtualisierung)
Library Subsystem:keins
Folgendes: Nachdem ich in einem größeren Code auf einen "Ruckler" im Progressbar aufmerksam geworden bin, konnte ich dieses auch mit dem Beispielcode aus der PB-Hilfe zum Thema "AddWindowTimer" replizieren: Am Ende, bevor der Progressbarbalken komplett ausgefüllt ist, kommt dieser ins Stocken und wird nicht voll, und wenn er wieder von vorne anfangen soll überspringt er den "Nullpunkt". Dieses Verhalten konnte ich auf 2 W7x64Pro und einem W7x64Home replizieren. Außerdem, wenn man den PB-Hilfe-Beispielcode zum Progressbar alleine nimmt und ausführt, dann werden die im Beispiel statischen Balken nicht sofort mit ihrem Endwert angezeigt, sondern sie "laufen von Null hoch" innnerhalb etwa 1 Sekunde.
Kann jemand diese beiden Verhalten bestätigen und ggf. erklären/lösen?
Danke und Grüße :)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Danilo »

Die animierte Progressbar von Windows ist bekannt. Windows animiert den "Anstieg" der Werte
automatisch, aber dazu muss die Event-Verarbeitung die ganze Zeit laufen.
Stockt Deine Event-Schleife in PB, kann es sein das auch die Progressbar-Updates stoppen (und somit ruckeln).

Hier ein Beispiel wie es animiert aussieht (Windows und Moderne Themen-Unterstützung benutzen):

Code: Alles auswählen

If OpenWindow(0, 0, 0, 800, 600, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0,  10, 10, 780,  30, 0, 100)
    SetGadgetState   (0, 100)
    ProgressBarGadget(1,  10, 40, 780,  30, 0, 200, #PB_ProgressBar_Smooth)
    SetGadgetState   (1, 200)
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Wenn die Event-Verarbeitung nach 100ms stoppt, sieht es so aus:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 800, 600, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0,  10, 10, 780,  30, 0, 100)
    SetGadgetState   (0, 100)
    ProgressBarGadget(1,  10, 40, 780,  30, 0, 200, #PB_ProgressBar_Smooth)
    SetGadgetState   (1, 200)
    
    start = ElapsedMilliseconds()
    Repeat : WindowEvent() : Until ElapsedMilliseconds()-start >= 100
    Delay(10000)
EndIf
Die Progressbar-Animation von Windows gibt es aber nur, wenn die Werte ansteigen.
Absteigend wird die Progressbar visuell gleich auf den richtigen Wert gesetzt.
Wenn Du also SetGadgetState() immer zweimal ausführst - einmal Wert+1 und
einmal mit dem Wert, wird es nicht animiert:

Code: Alles auswählen

Procedure SetProgressbarState(gadget,value)
    max = GetGadgetAttribute(gadget, #PB_ProgressBar_Maximum)
    If value >= max
        SetGadgetAttribute(gadget, #PB_ProgressBar_Maximum, max+1)
        SetGadgetState(gadget,max+1)
        SetGadgetAttribute(gadget, #PB_ProgressBar_Maximum, max)
        SetGadgetState(gadget,max)
    Else
        SetGadgetState(gadget,value+1)
        SetGadgetState(gadget,value)
    EndIf
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "ProgressBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0,  10, 10, 780,  30, 0, 100)
    SetGadgetState(0, 100)
    ProgressBarGadget(1,  10, 40, 780,  30, 0, 200, #PB_ProgressBar_Smooth)
    SetProgressbarState(1, 200)
    
    start = ElapsedMilliseconds()
    Repeat : WindowEvent() : Until ElapsedMilliseconds()-start >= 100
    Delay(10000)
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Berti
Beiträge: 3
Registriert: 14.05.2014 22:09

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Berti »

:D Hallo, und äääh, da waren doch gerade noch 2 Antworten?????
Danke Danilo und der andere, dessen Namen ich nun nicht mehr weiß? Das Ergebnis/die Lösung sieht ja wie "von hinten durch die Brust ins Auge" aus ;-) Aber das war doch bei XP noch nicht nötig!!
Ich habe da den Original-Hilfe-Beispielcode von "AddWindowTimer" mit eurer Erweiterung angepasst:

Code: Alles auswählen

Procedure SetProgressBarStateFast(Gadget, State)
  MaxState = GetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum)
  
  If State < MaxState
    SetGadgetState(Gadget, State + 1)
    SetGadgetState(Gadget, State)
  Else
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState + 1)
    SetGadgetState(Gadget, MaxState + 1)
    SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 400, 100, "Timer Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0, 10, 20, 380, 20, 0, 100)
    ProgressBarGadget(1, 10, 50, 380, 20, 0, 100)
    AddWindowTimer(0, 123, 400)
    
    Value = 0
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Timer And EventTimer() = 123
    ;dieses
        SetProgressBarStateFast(0, Mod(Value,100)+10)
    ;oder dieses          (es gehen auch beide gleichzeitig, dadnn fällt aber der Sprung im unteren nicht so auf)
        ;SetGadgetState(1, Mod(Value,100)+10)
        Value + 10
        
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
  EndIf
Wenn man wechselweise unten das Semikolon entfernt, kann man sehen, daß bei gleichen Werten (!!) der Balken unterschiedlich weit ausgefüllt wird. hmm, eigenartig. Und: Unten hakt/springt er von rechts vom Ende zum Start.
Ist das nun ein Bug?? Deshalb ja auch hier gepostet.
Was solls. Vielen Dank :D :D :D
Ach ja, gibt's eigentlich den ProgressBar auch umgekehrt, also quasi invers, von links nach rechts abnehmend, oder muss ich mir das dann doch per Grafik selbst basteln??[/size]
Nachtrag: Wenn ich die "moderne Themen Unterstützung" im Compiler abschalte, sehen beide Bars bei gleichzeitiger Darstellung identisch aus :-
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Sicro »

Berti hat geschrieben:da waren doch gerade noch 2 Antworten?????
Ja, das war ich. Ich habe erst später realisiert, dass Danilo bereits eine Procedure in seinem Code drin hat, die funktionell meiner Procedure übereinstimmt. Also habe ich mein Beitrag wieder entfernt. Vielleicht sollte ich mir das abgewöhnen.
Berti hat geschrieben:gibt's eigentlich den ProgressBar auch umgekehrt [...] oder muss ich mir das dann doch per Grafik selbst basteln??
Musst du selber malen.
Berti hat geschrieben:Nachtrag: Wenn ich die "moderne Themen Unterstützung" im Compiler abschalte, sehen beide Bars bei gleichzeitiger Darstellung identisch aus :-
Dadurch werden ja auch wieder die alten Controlls verwendet, die keine Animation anzeigen.


Deine interessante Feststellung mit den zwei unterschiedlichen Balken bei gleichem Wert, werde ich nachher mal unter Windows ansehen.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Danilo »

Ich sehe keinen Fehler, ausser die Windows-Animation der Progressbar.
Während die obere Progressbar die Werte 10,20,30,40,.. direkt anzeigt,
werden bei der Unteren Zwischenwerte animiert. Oben springt es direkt
von 30 auf 40, unten animiert es (nur visuell) mit 30, 31, 32, 33, .. 39, 40 -
und somit hängt die untere Progressbar immer ein bisschen nach.
Noch besser sieht man dieses Verhalten, wenn man den Timer mal auf
1000ms setzt.

Beispiel:

Code: Alles auswählen

Procedure SetProgressBarStateFast(Gadget, State)
    MaxState = GetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum)
    
    If State < MaxState
        SetGadgetState(Gadget, State + 1)
        SetGadgetState(Gadget, State)
    Else
        SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState + 1)
        SetGadgetState(Gadget, MaxState + 1)
        SetGadgetAttribute(Gadget, #PB_ProgressBar_Maximum, MaxState)
        SetGadgetState(Gadget, MaxState)
    EndIf
EndProcedure

Procedure ReverseProgressbar(gadget)
    SetWindowLongPtr_(GadgetID(gadget),#GWL_EXSTYLE,GetWindowLongPtr_(GadgetID(gadget),#GWL_EXSTYLE)|#WS_EX_LAYOUTRTL)
EndProcedure

#PBS_SMOOTHREVERSE = $10
#PBM_SETMARQUEE    = #WM_USER+10

If OpenWindow(0, 0, 0, 400, 330, "Timer Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ProgressBarGadget(0, 10, 20, 380, 20, 0, 100)
    ProgressBarGadget(1, 10, 50, 380, 20, 0, 100)
    ProgressBarGadget(2, 10, 80, 380, 20, 0, 100)
    ProgressBarGadget(3, 10,110, 380, 20, 0, 100,#PBS_SMOOTHREVERSE)
    
    ProgressBarGadget(4, 10,140, 380, 20, 0, 100)
    ProgressBarGadget(5, 10,170, 380, 20, 0, 100)
    ProgressBarGadget(6, 10,200, 380, 20, 0, 100)
    ProgressBarGadget(7, 10,230, 380, 20, 0, 100,#PBS_SMOOTHREVERSE)
    
    ProgressBarGadget(8, 10,260, 380, 20, 0, 100,#PBS_MARQUEE)
    SendMessage_(GadgetID(8),#PBM_SETMARQUEE,#True,10)
    
    ProgressBarGadget(9, 10,290, 380, 20, 0, 100,#PBS_MARQUEE)
    SendMessage_(GadgetID(9),#PBM_SETMARQUEE,#True,10)

    ReverseProgressbar(4)
    ReverseProgressbar(5)
    ReverseProgressbar(6)
    ReverseProgressbar(7)
    ReverseProgressbar(9)
    
    AddWindowTimer(0, 123, 1000)
    
    Value = 0
    Repeat
        Event = WaitWindowEvent()
        
        If Event = #PB_Event_Timer And EventTimer() = 123
            SetProgressBarStateFast(0, Value)
            SetProgressBarStateFast(2, 100-Value)
            SetProgressBarStateFast(4, Value)
            SetProgressBarStateFast(6, 100-Value)
            
            SetGadgetState(1, Value)
            SetGadgetState(3, 100-Value)
            SetGadgetState(5, Value)
            SetGadgetState(7, 100-Value)
            
            Value + 10
            If Value > 100
                Value = 0
            EndIf
            
        EndIf    
        
    Until Event = #PB_Event_CloseWindow
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Berti
Beiträge: 3
Registriert: 14.05.2014 22:09

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Berti »

Hallo Danilo,
Ich sehe keinen Fehler, ausser die Windows-Animation der Progressbar
:D
Ja, stimmt, bei deinem Beispielcode (Vielen dank, jetzt weiß ich auch, wie es umgekehrt geht :wink: ) sehe ich auch keine Sprünge.
Wenn Du in meinem letzten Code auch keine siehst, dann liegt es vielleicht an meinem PC oder wer weiß an was.
Noch besser sieht man dieses Verhalten, wenn man den Timer mal auf
1000ms setzt.
Ist natürlich als Versuch machbar, aber in einem komplexen Programmcode sollte eine gewählte Funktion/Gadget sich schon so wie angegeben verhalten.
Egal, ich weiß nun Abhilfe.
Vielen Dank Dir und Sirco :allright:
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Win7x64Pro][5.22LTS]Progressbar jumps and stopps

Beitrag von Danilo »

Berti hat geschrieben:
Noch besser sieht man dieses Verhalten, wenn man den Timer mal auf
1000ms setzt.
Ist natürlich als Versuch machbar, aber in einem komplexen Programmcode sollte eine gewählte Funktion/Gadget sich schon so wie angegeben verhalten.
Ich stimme Dir da grundsätzlich zu, aber das Ganze ist mMn etwas komplexer und hängt auch mit der
Event-Verarbeitung ab.
Wenn PB diesen Workaround mit "Wert+1 : Wert" einbaut, verlieren wir das Standardverhalten von Windows,
und das sollte nicht sein. Ich könnte mir noch vorstellen, dass das PB-Team vielleicht ein Flag dafür einführt,
so dass man die automatische Animation von Windows abstellen kann.
(Beim nächsten Windows, mit neuen Themes und neuem Verhalten, müssen dann wieder neue
Workarounds eingebaut werden. Vom PB-Team oder von uns.)

Dazu kommt noch, dass die automatische Windows-Animation (die zu modernen Themen dazugehört),
auf eine unterbrechungsfreie Event-Verarbeitung angewiesen ist.
Das ist aber wiederum ein generelles Problem bei Single-Thread Prozessen. Wenn unsere Programme
2 oder 5 Sekunden rödeln müssen, werden während dieser Zeit von allein keine Events verarbeitet, und somit
reagieren auch Fenster und Gadgets nicht (z.B. Fenster schliessen u.ä.).

Im englischen Forum hatten wir das Thema 2012 schon mal. Dort findest Du ein paar Code-Schnipsel,
die Dir evtl. noch weiterhelfen könnten: Refresh Progressbar gadget
In einem Beitrag von mir ein simples Beispiel wo die Arbeit in einen Thread gepackt
wird, und währenddessen die Event-Verarbeitung im Hauptteil weiter läuft.

Ob Bug oder nicht, muss das PB-Team entscheiden. freak liest hier ja mit, und könnte
zumindest zu Bugmeldungen auch mal was sagen.
Im englischen Forum bekommt man aber auch oft keine Rückmeldung. Wenn der Bug
gemeldet ist, muss man einfach warten bis irgendwann mal eine Meldung kommt, dass
es gefixt ist (ist im engl. Forum so, hier ist mir das nicht bekannt).
Das kann aber Wochen/Monate/Jahre dauern, manchmal ist es nach 2 Tagen gefixt.
Der Durchschnitt dürfte ein paar Monate sein, je nachdem wann die nächste (LTS-)Version
raus kommt.
Bis dahin ist man im Ungewissen und muss selbst Workarounds nutzen, wenn es welche gibt.
Gehe also einfach davon aus, dass der Bug vom Team stillschweigend registriert wurde.
Wenn Du noch sicherer gehen möchtest, melde es im internationalen/englischen Forum.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten