Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi pbstMarquee richtig verwenden? (https://www.delphipraxis.net/161030-pbstmarquee-richtig-verwenden.html)

stahli 13. Jun 2011 13:07


pbstMarquee richtig verwenden?
 
Ich dachte eigentlich, ProgressBar.Style = pbstMarquee würde automatisch in einem Thread laufen und immer eine Aktivität anzeigen (solange die Progressbar sichtbar ist).
Ich wollte dies nutzen, um einen Speicherungsprozess anzuzeigen, in dem die Anwendung mal kurz "hängt" (1-2 Sec).

Der Fortschritt wird aber nur dargestellt, wenn die Anwendung Freiraum hat (Idle).
Wenn ich die Progressbar beim Speichern von Hand aktualisieren muss, wird das etwas umständlich.

Bin ich auf dem Holzweg? Wie geht es richtig?

mkinzler 13. Jun 2011 13:10

AW: pbstMarquee richtig verwenden?
 
Die garfische Aktualisierung erfolgt aber im Hauptthread. Mach es eher andersrum und lagere den Speicherungsprozess in einen Thread aus

mirage228 13. Jun 2011 13:10

AW: pbstMarquee richtig verwenden?
 
Ich glaub mit der VCL muss derzeit alles GUI-mäßiges im Hauptthread geschehen, wird bei der Progressbar wahrscheinlich genauso sein.

Kannst Du eventuelle Deine Speicheroperation in einen Thread auslagern? Damit müsste es gehen.

himitsu 13. Jun 2011 13:19

AW: pbstMarquee richtig verwenden?
 
Das Neuzeichnen dieser Queue geschieht auch über Messages und wenn der Hauptthread hängt, dann hängen alle Messages fest und keiner zeichnet sich neu.

s.h.a.r.k 13. Jun 2011 16:18

AW: pbstMarquee richtig verwenden?
 
Daher habe ich mir angewöhnt, alles, was nicht mit der GUI zu tun hat und längere Zeit der Berechnung/Abarbeitung benötigen könnte, in einen Thread auszulagern.

Das gleiche Problem hat man z.B. wenn du eine GIF-Animation laufen lassen willst -- über diesen Weg bin ich über das Problem gestolpert.

haentschman 13. Jun 2011 16:27

AW: pbstMarquee richtig verwenden?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo...

es gab mal jemanden der hat eine Ubuntu Progressbar gemacht...
Zitat:

Copyright 2008 - 2009 bei Jonas Döbertin
Im Anhang eine Threadversion mit freundlicher Unterstützung von DeddyH.

Sollte dieses in irgend einer Weise die Regeln verletzen bitte ich um Mitteilung. :hi:

Die UbuntuProgress.pas in den Originaldateien ersetzen (ZIP)

s.h.a.r.k 13. Jun 2011 16:29

AW: pbstMarquee richtig verwenden?
 
Zitat:

Zitat von haentschman (Beitrag 1106172)
Sollte dieses in irgend einer Weise die Regeln verletzen bitte ich um Mitteilung. :hi:

Code:
//  TUbuntuProgress
//  Version 1.2
//
//  Copyright 2008 - 2009 bei Jonas Döbertin
//  E-Mail: jonas@doebertin.de
//  Diesen Projekt ist Open-Source und wird es auch immer bleiben.
//  Jeder der möchte kann diesen Code weitergeben und verwenden wie
//  er möchte, Bedingung ist, das dieser Hinweis enthalten bleibt.
//  Wenn dieser Code in einem Projekt verwendung findet, würde ich
//  mich lediglich über eine kleine Nachricht freuen!
Ich denke nicht ;) Aber das eigentliche Problem wird es wohl (leider) nicht lösen.

haentschman 13. Jun 2011 16:31

AW: pbstMarquee richtig verwenden?
 
Warum nicht ? Die Progressbar läuft und läuft und läuft... egal was die GUI oder der Rest macht.

s.h.a.r.k 13. Jun 2011 16:41

AW: pbstMarquee richtig verwenden?
 
Wäre zu schön um wahr zu sein, aber wenn der Hauptthread hängt, dann wird nichts neu gezeichnet, zumindest kenne ich es so :) Zudem habe ich hier sogar noch den Beweis, dass es nicht gehen kann:
Delphi-Quellcode:
procedure TMarqueeThread.Execute;
begin
  inherited;
  repeat
    if WaitForSingleObject(FStop, FInterval) = WAIT_TIMEOUT then
      Synchronize(DoOnTimer);
  until Terminated;
end;
Die Animation selbst wird via Thread berechnet, okay. Aber dann wird hier Synchronize aufgerufen, sodass die ProgressBar neu gezeichnet wird. Hängt der Hauptthread, dann steht somit auch der TMarqueeThread, da das Synchronize erst dann zurückkehrt, wenn der Hauptthread die gegebene Methode abgearbeitet hat, aber der steht ja...

stahli 13. Jun 2011 16:50

AW: pbstMarquee richtig verwenden?
 
Ok, danke für die Antworten. Ich dachte, die Progressbar startet im Marquee-Mode selbst einen eigenen Thread in dem sie sich neu zeichnet - und ich hätte etwas falsch eingestellt.
Ich rufe jetzt StepIt erst mal in meiner Speicherfunktion auf. Das tut es erst mal notdüftig.

Andere Lösungen teste ich ggf. später mal noch.

haentschman 13. Jun 2011 17:06

AW: pbstMarquee richtig verwenden?
 
@s.h.a.r.k

ähmm... ich hatte überlesen, daß die Berechnungen im Hauptthread ausgeführt werden. Die müssen in einen extra Thread. Dann hast du natürlich Recht.
Sorry für Dummschwatz...:stupid:

stahli 13. Jun 2011 18:07

AW: pbstMarquee richtig verwenden?
 
So läuft das recht flüssig, ohne einen Thread zu nutzen.
Ich rufe in der Schleife immer diesen Teil auf:
Delphi-Quellcode:
  if Assigned(odProgressBar) then
  begin
    odProgressBar.Tag := odProgressBar.Tag + 1;
    if odProgressBar.Tag > 100 then
    begin
      odProgressBar.Refresh;
      odProgressBar.Tag := 0;
    end;
//    Application.ProcessMessages;
  end;
Die Alternative wäre ProcessMessage, aber das ist ja nicht immer sinnvoll.

himitsu 13. Jun 2011 19:31

AW: pbstMarquee richtig verwenden?
 
Marqueue-Style und
Delphi-Quellcode:
if Assigned(odProgressBar) then
begin
  odProgressBar.StepIt;
  odProgressBar.Refresh; // .Repaint;
end;

stahli 13. Jun 2011 19:48

AW: pbstMarquee richtig verwenden?
 
StepIt und Refresh haben bei meinen Tests das gleiche bewirkt.
Es wurde damit bei jedem Durchlauf ein Fortschritt gezeichnet - allerdings rasend schnell.
Daher refreshe ich bei jedem 100sten Durchlauf.
Für mich passt das so perfekt (sieht fast so aus, als würde der Fortschritt in einem Thread laufen ;-)).

sx2008 13. Jun 2011 20:41

AW: pbstMarquee richtig verwenden?
 
Man kann auch mit TAnimate nette Ergebnisse erzielen.
Dazu lädt man eine kleine AVI (zur Designzeit oder zur Laufzeit) und schaltet
die einzelnen Bilder schrittweise mit Seek() durch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz