StatusBarProgress() und ProgressBarGadget() reagieren träge

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

StatusBarProgress() und ProgressBarGadget() reagieren träge

Beitrag von Lord »

Anläßlich eines aktuellen Projekts habe ich festgestellt,
daß bei mir ein StatusBarProgress() unter Windows 7
sehr träge reagiert.
Beispiel:

Code: Alles auswählen

OpenWindow(1, 10,10,400,200,"")
CreateStatusBar(1,WindowID(1))
AddStatusBarField(#PB_Ignore)
AddStatusBarField(40)
AddStatusBarField(40)
AddStatusBarField(128)
StatusBarProgress(1,3, 0, #PB_StatusBar_BorderLess, 0, 10)
TrackBarGadget(1, 10,10,380,20, 10,255)
TrackBarGadget(2, 10,50,380,20, 0,10)
StatusBarText(1, 1, Str(GetGadgetState(1)))
StatusBarText(1, 2, Str(GetGadgetState(2)))

Repeat
  Event=WaitWindowEvent()
  EventGadget =EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          max=GetGadgetState(1)
          SetGadgetAttribute(2,#PB_TrackBar_Maximum,max)
          StatusBarProgress(1,3,GetGadgetState(2),#PB_StatusBar_BorderLess, 0,max)
          StatusBarText(1, 1, Str(GetGadgetState(1)))
          StatusBarText(1, 2, Str(GetGadgetState(2)))
        Case 2
          StatusBarProgress(1,3,GetGadgetState(2))
          StatusBarText(1, 2, Str(GetGadgetState(2)))
      EndSelect
  EndSelect
  
Until Event=#PB_Event_CloseWindow
Mit dem oberen TrackBar läßt sich der Bereich des
StatusBarProgress einstellen, mit dem unteren dieses
"befüllen".
Wenn man den Slider jetzt sehr schnell bewegt, kommt
die Anzeige nur sehr träge nach. Das ist auch in meinem
Programm so. Schnelle Änderungen werden nur verzögert
dargestellt.
Läßt sich dieses träge Verhalten durch ein Flag oder einen
API-Call ändern?

Edit:
Titel geändert, da sowohl StatusBarProgress() als auch
ProgressBarGadget() das gleiche Verhalten zeigen.
Zuletzt geändert von Lord am 16.09.2011 17:17, insgesamt 2-mal geändert.
Bild
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: StatusBarProgress() reagiert träge

Beitrag von Kiffi »

ich glaube, das ist 'by Design' so unter 'neueren' Betriebssystemen und
der 'schöneren' UI geschuldet.

Wenn Du testweise mal den 'XP skin support' in den Compiler-Optionen
abschaltest, wirst du sehen, dass die Progressbar sehr wohl recht fix
reagiert.

Wie man mit angeschaltetem Skin-Support eine schnellere Progressbar
hinbekommt, kann ich Dir leider nicht sagen

Grüße ... Kiffi
a²+b²=mc²
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: StatusBarProgress() reagiert träge

Beitrag von Christian+ »

Das liegt am Design ist auf Win 7 und Vista so ob es da für eine API Lösung gibt weiß ich nicht.
Allerdings kannst du es weitgehend umgehen in dem du immer

Code: Alles auswählen

StatusBarProgress(1, 3, GetGadgetState(2) + 1)
StatusBarProgress(1, 3, GetGadgetState(2))
statt nur

Code: Alles auswählen

StatusBarProgress(1,3,GetGadgetState(2))
schreibst da beim rückwärts laufen es keine Animation gibt wird alles sofort dargestellt.
Das geht allerdings nur für Werte < Max. dies fällt allerdings wenn du keine zu grobe einteilig nimmst kaum auf.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() reagiert träge

Beitrag von Lord »

@Kiffi:
Da hast Du wohl Recht, aber den Skin-Support möchte
ich nicht abschalten. Aber Danke für den Hinweis.

@Christian+
Mit Deinem Vorschlag hat man wieder eine halbwegs
brauchbare Anzeige. Damit kann ich erstmal leben. Danke.
Obiges Beispiel erweitert:

Code: Alles auswählen

Define max.i=10
Define Wert.i=0
Dim BtTxt.s(1)
BtTxt(0)="Träge"
BtTxt(1)="Flink"

OpenWindow(1, 10,10,400,200,"")
CreateStatusBar(1,WindowID(1))
AddStatusBarField((400-128)/2-40)
AddStatusBarField(40)
AddStatusBarField(128)
AddStatusBarField(40)
StatusBarProgress(1,2, 0, #PB_StatusBar_BorderLess, 0, 10)
TrackBarGadget(1, 10,10,380,20, 10,255)
TrackBarGadget(2, 10,50,380,20, 0,10)
StatusBarText(1, 1, Str(GetGadgetState(2)))
StatusBarText(1, 3, Str(GetGadgetState(1)))
ButtonGadget(4, (400-40)/2, 90, 40, 20, BtTxt(0), #PB_Button_Toggle)
ProgressBarGadget(3, (400-128)/2, 140, 128, 18, 1, 10,#PB_ProgressBar_Smooth)

Repeat
  Event=WaitWindowEvent()
  EventGadget=EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget
        Case 1
          max=GetGadgetState(1)
          SetGadgetAttribute(2,#PB_TrackBar_Maximum,max)
          SetGadgetAttribute(3,#PB_ProgressBar_Maximum,max)
          StatusBarProgress(1,2,GetGadgetState(2),#PB_StatusBar_BorderLess, 0,max)
          StatusBarText(1, 1, Str(GetGadgetState(2)))
          StatusBarText(1, 3, Str(max))
        Case 2
          Wert=GetGadgetState(2)
          If GetGadgetState(4)
            StatusBarProgress(1,2,Wert+1)
            StatusBarProgress(1,2,Wert)
            SetGadgetState(3,Wert+1)
            SetGadgetState(3,Wert)
          Else
            StatusBarProgress(1,2,Wert)
            SetGadgetState(3,Wert)
          EndIf
          StatusBarText(1, 1, Str(Wert))
        Case 4
          SetGadgetText(4, BtTxt(GetGadgetState(4)))
      EndSelect
  EndSelect
  
Until Event=#PB_Event_CloseWindow
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: StatusBarProgress() reagiert träge

Beitrag von PMV »

Lord hat geschrieben:@Christian+
Mit Deinem Vorschlag hat man wieder eine halbwegs
brauchbare Anzeige. Damit kann ich erstmal leben.
Kleiner Tipp am Rande:
Was du als "unbrauchbar" ansiehst, ist teil des Betriebssystems und
so von jedem Benutzer erwartet. Ich will die schöne Animation
garnicht missen und warum es sofort sein muss, ist mir schleierhaft.
Ein hässliches Springen seh ich als No-Go und Designbruch an. So
was geht nur bei Programm für den persönlichen Gebrauch.

Einem Fortschrittsbalken kannst du so wie so nur den ungefähren
Fortschritt entnehmen. Zu XP-Zeiten war es mehr normal als
Einzelfall, dass der Balken im gefüllten Zustand blieb und sich gleichzeitig
nichts tat. Dies passiert mit dem schönen Vista/ 7 Balken nicht mehr so.

Die Verzögerung stellt sicher, dass es Aktivitäten gibt, obwohl eventuell
gerade das Programm mitten in einem Vorgang steckt. Der Benutzer
wird sich eher freuen, wenn das Programm den nächsten Schritt anfängt,
kurz bevor der Balken voll ist. Genervt wird er eher sein, wenn der Balken
voll ist ... und nichts passiert. :wink:

Den einzigen Tipp, der dafür sinnvoll ist, um etwas passendere Füllstand
zu erreichen: erst den Balken auf den nächsten Wert setzten, und dann
die Aktivität dafür zu starten. Das heißt Balken mit 0 initialisieren und dann
z.b. auf 10 setzten, bevor die ersten Daten geladen wurden. Hier aber eben
aufpassen, das am Ende nicht doch der Balken länger voll ist, als der Benutzer
Gedult hat. <) Und wenn du dem Nutzer ganz genau zeigen willst, was das
Programm macht, dann braucht es eine Textanzeige. Der Balken ist nur visuelles
Gimmick um Benutzers folgendes schonend bei zu bringen: "bitte warten ..."


MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() reagiert träge

Beitrag von Lord »

PMV hat geschrieben:
Lord hat geschrieben:@Christian+
Mit Deinem Vorschlag hat man wieder eine halbwegs
brauchbare Anzeige. Damit kann ich erstmal leben.
Kleiner Tipp am Rande:
Was du als "unbrauchbar" ansiehst, ist teil des Betriebssystems und
so von jedem Benutzer erwartet. Ich will die schöne Animation
garnicht missen und warum es sofort sein muss, ist mir schleierhaft.
Ein hässliches Springen seh ich als No-Go und Designbruch an. So
was geht nur bei Programm für den persönlichen Gebrauch.

Einem Fortschrittsbalken kannst du so wie so nur den ungefähren
Fortschritt entnehmen. Zu XP-Zeiten war es mehr normal als
Einzelfall, dass der Balken im gefüllten Zustand blieb und sich gleichzeitig
nichts tat. Dies passiert mit dem schönen Vista/ 7 Balken nicht mehr so.

Die Verzögerung stellt sicher, dass es Aktivitäten gibt, obwohl eventuell
gerade das Programm mitten in einem Vorgang steckt. Der Benutzer
wird sich eher freuen, wenn das Programm den nächsten Schritt anfängt,
kurz bevor der Balken voll ist. Genervt wird er eher sein, wenn der Balken
voll ist ... und nichts passiert. :wink:

Den einzigen Tipp, der dafür sinnvoll ist, um etwas passendere Füllstand
zu erreichen: erst den Balken auf den nächsten Wert setzten, und dann
die Aktivität dafür zu starten. Das heißt Balken mit 0 initialisieren und dann
z.b. auf 10 setzten, bevor die ersten Daten geladen wurden. Hier aber eben
aufpassen, das am Ende nicht doch der Balken länger voll ist, als der Benutzer
Gedult hat. <) Und wenn du dem Nutzer ganz genau zeigen willst, was das
Programm macht, dann braucht es eine Textanzeige. Der Balken ist nur visuelles
Gimmick um Benutzers folgendes schonend bei zu bringen: "bitte warten ..."


MFG PMV
Das ist Deine Meinung.
Ich finde, das sieht nicht gut aus.
Und ob es "von jedem Benutzer" erwartet wird,
wage ich auch ganz stark zu bezweifeln. Mindestens
einer (nämlich ich, der ich auch Benutzer bin) erwartet
dieses Verhalten eben nicht. Es sollte zumindest also
deaktivierbar sein.
Übrigens "Schönheit" liegt ganz allein im Auge des Be-
trachters.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von PMV »

Schon mal was von Skin, Themes oder der Möglichkeit,
den klassischen (alten) Skin zu verwenden, gehört?
Der Betrachter hat bereits vom OS diese Möglichkeit.
Du als Entwickler für ein OS musst also garnichts dafür
tun. :wink: Wer es hässlich findet, nutzt was anderes.
So einfach ist das. <)


Und nur mal noch als Hinweis: Zu beginn hat mich die
Fortschrittsanzeige auch ein wenig irritiert und hab
angefangen über das selbe zu grübeln, wie du. :wink:
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Lord »

Warum werden hier in diesem Forum eigentlich
so häufig einfache Fragen dazu benutzt, um
anderen ihren Sinn für Schönheit, ihre Welt-
anschauung o.ä. aufzuoktroieren.
Die einfache Frage nach einem API-Call oder einem
Flag braucht nicht in einen Exkurs in No-Gos,
Designbruch oder andere Nebensächlichkeiten
ausarten.
@PMV: Du weißt nicht, wer Nutzer meines Programmes
sein wird und kennst nicht dessen Wünsche, Du
weißt nicht, welche Funktion die ProgressBar-
anzeige in meinem Programm erfüllen soll, des-
halb war Dein Beitrag hier in meinen Augen völlig
überflüssig. Wenn ich eine sofortige Reaktion
der ProgressBar haben will, dann ist das so. Da
braucht keiner Anfangen und versuchen, mir das
auszureden. Mit was für (fast hätte ich geschrieben
"dümmlichen") Argumenten auch immer. Eine einfache
Antwort "geht (so..)" oder "geht nicht(, weil..)"
hätte gereicht.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von PMV »

Ich hab dich lediglich auf etwas hin gewiesen. Was du damit
tust, ist nicht meine Sache und dir überlassen.
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Lord
Beiträge: 325
Registriert: 21.01.2008 19:11

Re: StatusBarProgress() und ProgressBarGadget() reagieren tr

Beitrag von Lord »

PMV hat geschrieben:Ich hab dich lediglich auf etwas hin gewiesen. Was du damit
tust, ist nicht meine Sache und dir überlassen.
Dann beschränke Dich bitte auf den Kern der Frage
und langweile nicht mit Deiner Weltanschauung.
Bild
Antworten