![]() |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Und wenn du dir zur Synchronisation einen Container baust, der alle Threads beherbergt und verwaltet? Das wäre glaube sinnvoller als für jeden Thread aufgrund einer anderen ID eine eigene Klasse zu schreiben ;-)
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Du hast doch in dem BEispiel 3 Threads, wleche im Grunde alle das Selbe machen, ist das in der "produktiven" Anwendung später auch so?
Denn so wie es jetzt ist, könnte mann alle Threads durch eine Thread-Klasse ersetzten. |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Dann schreibe dir eine Containerklasse, die die Threads verwaltet und die Ausgabe übernimmt.
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Zitat:
|
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Liste der Anhänge anzeigen (Anzahl: 1)
Ich benötige noch einmal Hilfe bzgl. dieser Thread-Beispielanwendung. Wenn ich anstatt der 3 Threads das ganze auf 10 Threads jeweils mit 10 Memofeldern ausweite, scheint das Fenster nicht mehr auf Aktionen zu reagieren. Dies betrifft etwa das Verschieben des Fensters oder das Drücken des Abbrechen-Schalters. Auch ein Verwenden von Application.ProcessMessages ändert daran nichts.
Anbei noch einmal die Beispielanwendung mit 10 Threads anstatt mit 3 Threads. Was kann man da machen ? Dass die Belastungsgrenze des Prozessors erreicht ist, kann ich mir nicht vorstellen. Der Prozess errteicht ja nichtmal 50 Prozent CPU-Auslastung. Die Threads verrichten ausserdem noch keine eigentliche Arbeit, sondern schreiben nur Zufallszahlen ins Memo. Bin über jede Hilfe dankbar. |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Du mußt bedenken, daß die Thread die Ganze Zeit über eigentlich nichts anderes machen, als den Hauptthread zu sperren und den Memos was übergeben (was die meußte Zeut eines Threads passiert, da er sonst nix macht) ... tja und der Hauptthread hat dann kaum noch Zeit sich um die VCL zu kümmer, also daß die Form und alles darauf reagiert.
PS: warum die Threads nicht soviel CPU-Last verbrauchen, liegt daran, daß sie sehr viel Zeit nichts tun, da sich oftmals darauf Warten, daß der Hauptthread mal Frei wird, damit sie auch endlich mal darauf zugreifen können. |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
Hi,
also auf meinem nicht mehr ganz so jungen Laptop läuft das Programm ganz flüssig. Wenn Du das allerdings im Debugger laufen läßt kannst du die Performance nicht mehr beurteilen, da der Debugger viel zu viel Leistung verbraucht um deine Threads zu kontrollieren. Allerdings ist mir aufgefallen, dass du zuviel (nämlich die ganze) Arbeit innerhalb von Synchronize verrichtest.
Delphi-Quellcode:
Es sollte eigentlich die Berechnung...
Procedure TBeispielThread4.DoThread;
begin randomize; FMemo.lines.add('Test Thread 4 - '+IntToStr(Random(200))); end;
Delphi-Quellcode:
von der Ausgabe mit Synchronize getrennt werden.
...
Randomize; // auch schon hier nicht so toll, nur einmal pro Programminstanz zufallszahl := Random(200); // zufallszahl = membervariable des threads, ebenso logstring logstring := 'Test Thread 4 - ' + IntToStr(Zufallszahl); Synchronize (Ausgabe); ....
Delphi-Quellcode:
Es kommt grundsätzlich darauf an, die Zeit innerhalb einer Synchronize ten Methode so kurz wie möglich zu halten, und die zeitaufwändigen Teile innerhalb der Thread.Execute zu halten.
procedure TThread4.Ausgabe;
begin FMemo.Lines.Add(logstring); end; Gruss [edit]falsche Quelltextformatierung[/edit] |
Re: Fehlermeldung "Element hat kein übergeördnetes Fens
@thkerkmann: Ich habe Deine Tips beherzigt und die eigentlichen Berechnungen in Execute untergebracht. Der Umstand, dass ich bei sehr aktiver Verwendung der Memos ein nicht mehr reagierendes Fenster habe, bleibt allerdings bestehen.
Hier habe ich etwas experimentiert und mal eine Sleep-Funktion eingefügt (etwa 500 Ticks vor jedem Schreibvorgang) und siehe da, dem Hauptthread bleibt wieder mehr Zeit für Reaktionen. In diesem Maße wie hier in der Beispielanwendung auf die Memos zugegriffen wird, ist das in der produktiven Anwendung natürlich nicht der Fall. Man könnte neben den eigentlichen Thread-Prioritäten auch die Fenster-Priorität erhöhen, ich glaube hierfür gibt es TForm1.SetPriority mit den 4 Prioritätsklassen Idle_Priority_Class, Normal_Priority_Class, High_Priority_Class und Realtime_Priority_Class. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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