AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Bug?] Delphi ist zu langsam?

Ein Thema von The Riddler · begonnen am 17. Nov 2008 · letzter Beitrag vom 17. Nov 2008
 
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#11

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 10:17
Zitat von Sir Rufo:
Jepp ein Thread ist genau das Richtige dafür.
Äh... Nö. Was soll der Anwender im Vordergrund anderes tun, wenn im Hintergrund der Thread abläuft?

Zitat von Sir Rufo:
Deine User/Kunden werden dankbar sein ...
Nun ja, eher herablassend lächeln. Der Spieltrieb lässt ab einem gewissen Alter stark nach.

Mach lieber Folgendes (das ist einfacher und für Deinen Anwendungsfall genauso gut):
Wenn Du z.B. eine Liste von Dateien hast, mit denen etwas geschieht, dann pack eine Progressbar auf die Form und dann das hier:
Delphi-Quellcode:
Procedure TForm1.ProcessMyFiles (Files : TStrings);
Var
  i : Integer;

Begin
  CancelButtonPressed := False; // Privates Boolean-Feld deiner Form
// Der Benutzer kann auf einen 'Abbruch' Knopf (CancelButton) drücken, siehe unten
  ProgressBar.Max := Files.Count+1;
  ProgressBar.Min := 0;
  For i:=0 to Files.Count Do Begin
    ProgressBar.Position := i+1;
    ProcessOneFile(Files[i]); // Eine Datei verarbeiten
    Application.ProcessMessages; // Mausbewegungen und Buttonclicks abarbeiten lassen
    If CancelButtonPressed Then Break; // Abburch gedrückt? Na dann: Abbruch!
  End;
End;

Procedure TForm1.CancelButtonClick (Sender : TObject);
Begin
  CancelButtonPressed := True;
End;
So sähe das schon etwas hübscher aus. Wenn nun jedoch das 'ProcessOneFile' länger als ungefähr 5 Sekunden braucht, sagt die Ergonomie-Lehre, das man noch zusätzliche Informationen anzeigen sollte. Der Anwender soll nicht denken, das die Büchse hängt.
Also kannst Du z.B. in einer zweiten Progressbar den Fortschritt innerhalb der Datei anzeigen.

Wichtig ist, das man ab und an 'Application.ProcessMessages' aufruft. Was die Routine macht? Nun, alle Interaktionen, also Tastendrücke, Mausklicks und -bewegungen etc. werden an die Anwendung in eine Botschaftsliste (Messagequeue) gepackt. Die Anwendung arbeitet nun im Leerlauf immer diese Liste ab, sodaß eben sofort auf Button-Clicks etc. reagiert wird. Das siehst Du nicht, das macht das Application-Objekt alleine.

Wenn Du aber nun rumrechnest, kommt die Application nicht mehr dazu, also musst Du ihr ab und an die Arbeit abnehmen.

Wenn Du natürlich zu oft Application.ProcessMessages aufrufst, dann verlangsamst Du deine Arbeit. Daher kannst Du z.B. bei einem Zähler nur jedes 100ste Mal die Messagequeue abarbeiten lassen. Das passt schon.

Und der Abbruch-Button gibt dem Anwender die totale Kontrolle.

Wozu ein Thread, wenn der Anwender doch nichts anderes machen kann?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 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