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
Antwort Antwort
Seite 2 von 4     12 34      
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, 11: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
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#12

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 11:53
Zitat von alzaimar:
Wozu ein Thread, wenn der Anwender doch nichts anderes machen kann?
Es gibt nur einen Grund: Besseres Programmdesign. Wenn du mit Threads programmierst, kannst du die Berechnungen zum Beispiel auf mehrere Prozessorkerne aufteilen und somit auf Multicoreprozessoren schneller zu einem Ergebnis kommen.

Delphi-Quellcode:
procedure MachWas;
begin
  Thread := TMeinThread.Create;
  Thread.Resume;
  while not Thread.Terminated do
  begin
    Application.ProcessMessages;
    Sleep(10);
  end;
  Thread.Free;
end;
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 11:54
Also eine lange Berechnung interaktiv durchzuführen und mit Application.ProcessMessages die Anwendung dazu zu bringen ab und an die Anzeige zu refreshen halte ich nicht wirklich für einen guten Programmierstil.

Selbst das Minimieren und dann Wiederherstellen einer solchen Anwendung ist auf Gedeih und Verderb davon abhängig, ob dann auch vielleicht ein Application.ProcessMessages kommt.

Eine Anwendung die sich nicht mehr richtig anfühlt (minimieren - wiederherstellen - Fensterinhalt ist grau) wird oft auch einfach nur beendet. Es zeugt von schlechter Programmierung oder auch von Arroganz, wenn man den Anwender auf die Stufe eines Dummchens heruntersetzt - der soll halt gefälligst warten, ich melde mich schon, wenn was passiert, solange ist halt Schicht im Schacht.

Mit der Jedi-VCL-Komponente TJvThread sollte es eigentlich jedem möglich eine längere Berechnung in einem Thread ablaufen zu lassen, so dass es keinen Grund gibt, dieses nicht zu tun.

Aber das ist nur meine Sicht der Dinge ... ITW habe ich schon viele Negativ-Beispiele gesehen ...

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
The Riddler
(Gast)

n/a Beiträge
 
#14

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 12:07
Ja, ich lasse ja bereits eine ProgressBar anzeigen wie weit der Prozess fortgeschritten ist. Da teilweise ~240 Strings in einer Datei ersetzt werden, kann es aber ~15s für eine Datei dauernd bis dann der Fortschrittsbalken einen Schritt nach vorn geht.

Fremdkomponenten wie JEDI möchte ich ehrlich gesagt nicht verwenden...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 12:13
Zitat:
Fremdkomponenten wie JEDI möchte ich ehrlich gesagt nicht verwenden...
Und warum?
Markus Kinzler
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#16

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 12:14
Zitat von mkinzler:
Es gibt Rechenzeit ab.
Ganz im Gegenteil. Application.ProcessMessages zieht 100% CPU Last (bei einer CPU) an sich. Nur wir die Zeit für die Botschaftsverarbeitung genutzt. Ein "while not Terminated do Application.ProcessMessage;" bremst alle anderen Anwendungen aus, lässt deine Anwendung aber ratzfatz reagieren.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 13:00
Zitat von The Riddler:
Fremdkomponenten wie JEDI möchte ich ehrlich gesagt nicht verwenden...
Die brauchst Du auch nur dann verwenden, wenn Du es nicht schaffst eine ThreadKlasse selber zu erstellen.

Das ist dann also "Threads 4 Dummies"

cu

Oliver
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#18

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 14:05
Bis jetzt bin ich mit Threads ganz gut gefahren, auch wenn's nur mal um eine Funktion oder ging, die Zeit gebraucht hat.

Anschauen würde ich mir das schon, lohnt sich.
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 15:28
Also für alle die mal einen Thread benutzen wollen (sollen, müssen oder wie auch immer) und sich mit Händen und Füßen gegen irgendwelche Komponenten-Sammlungen welcher Art auch immer wehren, hier ein Thread-Gerüst mit angehängtem Beispiel-Projekt.

Ich war auch bemüht mittels Compiler-Schalter diverse Features in das Thread-Gerüst zu packen:

- Progress
- Status
- Events
- Datenübergabe an Thread
- CriticalSections
- Datenbank-Zugriffe

cu

Oliver
Angehängte Dateien
Dateityp: zip templatethread_178.zip (4,6 KB, 111x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#20

Re: [Bug?] Delphi ist zu langsam?

  Alt 17. Nov 2008, 15:32
Zitat:
Also für alle die mal einen Thread benutzen wollen (sollen, müssen oder wie auch immer) und sich mit Händen und Füßen gegen irgendwelche Komponenten-Sammlungen welcher Art auch immer wehren
Autsch. Na das sollte man ohne eine externe Kompo. schon können müssen als Programierer. Wenn nicht Lernen soll da schon helfen.

// Edit:

@Sir Rufo, schickes Demo. Für einen Anfänger aber ggf. zu viel Zeugs in einem Programm.
Einzele Programme ürden für mer Übersichtlichkeit sorgen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 08:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz