AGB  ·  Datenschutz  ·  Impressum  







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

Thread - Problem

Ein Thema von engel · begonnen am 15. Okt 2006 · letzter Beitrag vom 30. Okt 2006
Antwort Antwort
engel

Registriert seit: 13. Nov 2004
Ort: Lüneburg
25 Beiträge
 
Delphi 3 Professional
 
#1

Thread - Problem

  Alt 15. Okt 2006, 19:32
Ich führe eine Berechnung in einem Thread aus, die ein außerhalb des Thread definiertes Array bearbeitet, und zwar so: Ist eine Teil-Berechnung fertig, rufe ich in der OnTerminate-Ereignisprozedur des Thread eine Prozedur im Hauptthread auf, die
1. Die berechneten Daten aus dem Array auswertet und in eine Datei speichert
2. den gleichen Thread mit neuen Berechnungsparametern erneut startet
wodurch sich ein Berechnungskreislauf ergibt, so dass die Anwendung ständig beschäftigt ist.
Es passiert nun nach einigen Stunden fehlerfreien Ablaufs, dass das Programm ohne Fehlermeldung stehenbleibt, anscheinend, weil die max. von Windows verwaltbare Threadanzahl überschritten wurde. Es lässt sich jedenfalls in diesem Zustand keine andere Anwendung mehr starten.
Jetzt habe ich von m_junglas im Thema "Programmabsturz! Warum?" gelernt, dass der Thread nach OnTerminate keineswegs schon beendet ist und man keinen Einfluss darauf hat, wann Windows nun gedenkt, ihn wirklich zu beenden. Dass das wirklich so ist, sieht man auch, wenn man in der OnTerminate-Ereignisprozedur "WaitFor" verwendet - Das Programm steht dann ab da und wartet quasi auf sich selbst. Wenn das also so ist, ist OnTerminate für mich unbrauchbar, denn ich will ja den Thread quasi aus der OnTerminate-Ereignisprozedur heraus neu starten (eigentlich ein Wunder, dass das Programm erst nach Stunden, d.h. nach einigen Tausend Berechnungs-Zyklen, stehenbleibt). Also hier beißt sich die Katze in den Schwanz, denn in der OnTerminate-Ereignisprozedur darf ich den Thread auch nicht beenden, wie schon m_junglas feststellte, andererseits will ich den Hauptthread auch nicht ständig prüfen lassen, ob der Thread noch läuft, so ähnlich wie NicoDE im Thema "Unit in Thread packen?!" vorschlug...:

while not CalculationTerminated do Application.ProcessMessages(); // Solange die GUI reagieren lassen

...denn ich brauche den Prozessor ja für die Berechnung.

Ich brauche also, im Gegensatz zu OnTerminate, das Ereignis, wann der Thread WIRKLICH von Windows beendet wurde. Delphi erkennt das ja anscheinend auch, wie man im Debugfenster "Threads" sehen kann.
Weiß einer, wie man's macht?

Zusatzfrage: Wie ändere ich eigentlich die Priorität des Haupt-Thread einer Anwendung?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Thread - Problem

  Alt 15. Okt 2006, 19:41
Moin engel,

Zitat von engel:
andererseits will ich den Hauptthread auch nicht ständig prüfen lassen, ob der Thread noch läuft,
...
...denn ich brauche den Prozessor ja für die Berechnung.
Ja und? Wenn Du Nicos Verschlag folgst funktioniert das doch...

While BerechnungOffen do begin
Thread erstellen
Thread mit Daten füttern
Thread starten, und auf Ende warten.
Thread freigeben.
end;


Zitat von engel:
Delphi erkennt das ja anscheinend auch, wie man im Debugfenster "Threads" sehen kann.
und wer sagt, dass das an einem Ereignis liegt, und nicht genauso gemacht wird, wie oben beschrieben?


[EDIT]
Zitat von engel:
wann der Thread WIRKLICH von Windows beendet wurde.
Ich will mal schwer hoffen, dass ein Thread nicht von Windows beendet wird, dass könnte dann eigentlich nur durch TerminateThread erfolgen, was einem "Abschiessen" des Threads gleichkommt, also nicht gerade empfehlenswert ist.
[/EDIT]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
engel

Registriert seit: 13. Nov 2004
Ort: Lüneburg
25 Beiträge
 
Delphi 3 Professional
 
#3

Re: Thread - Problem

  Alt 15. Okt 2006, 19:56
Zitat:
Ja und? Wenn Du Nicos Verschlag folgst funktioniert das doch...
Ich behaupte ja auch nicht, dass es nicht funkt', sondern dass es meine Berechnung verlangsamt
Es muss doch was Besseres geben.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Thread - Problem

  Alt 15. Okt 2006, 20:22
Wieso erstellst Du einen Thread jedesmal neu?

Schreibe dir einen 'Workerthread', der im Hintergrund auf Jobs wartet. Sobald ein Job ankommt, wird er bearbeitet und anschließend geht das Spiel von vorne los. Falls zwischenzeitlich ein neuer Job angekommen ist, wird der gleich verarbeitet. So ist das sauber.

Und ein Job ist einfach eine Teilaufgabe. Ich vermute, das Du im OnTerminate den Thread nicht einfach neu anstoßen kannst. Vielleicht kommt Windows da durcheinander.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Thread - Problem

  Alt 15. Okt 2006, 20:29
Hi,

So sollte es mit weniger CPU last gehen:
Delphi-Quellcode:
    
     While BerechnungOffen do
     begin
       //Thread erstellen
       //Thread mit Daten füttern
       repeat
         dwWaitResult := WaitforSingleObject(Thread.Handle, 200);
         if dwWaitResult <> WAIT_OBJECT_0 then
         begin
           Application.ProcessMessages;
         end;
       until dwWaitResult = WAIT_OBJECT_0;
       //Thread freigeben
     end
Hierbei dient BerechnungOffen nur zum Beenden der gesammten Berechnung.
Du wirst ohne eine Steuerung auserhalb des Arbeitenden Threads nicht auskommen.

Edit : oder so wie alzaimar es vorgeschlagen hat mit Jobs dafür giebts hier auch irgendwo einen Code.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
engel

Registriert seit: 13. Nov 2004
Ort: Lüneburg
25 Beiträge
 
Delphi 3 Professional
 
#6

Re: Thread - Problem

  Alt 15. Okt 2006, 23:43
Zitat von alzaimar:
Wieso erstellst Du einen Thread jedesmal neu?

Schreibe dir einen 'Workerthread', der im Hintergrund auf Jobs wartet. Sobald ein Job ankommt, wird er bearbeitet und anschließend geht das Spiel von vorne los. Falls zwischenzeitlich ein neuer Job angekommen ist, wird der gleich verarbeitet. So ist das sauber.

Und ein Job ist einfach eine Teilaufgabe. Ich vermute, das Du im OnTerminate den Thread nicht einfach neu anstoßen kannst. Vielleicht kommt Windows da durcheinander.
Hört sich gut an! Leider keinen blassen Schimmer, wie man einen Thread auf Job's warten lässt.
Was ich weiß ist, dass die Execute-Methode des Threads nur einmal ausgeführt werden kann (oder stimmt das nicht?). Dann müsste die Execute-Methode ja eine Endlosschleife enthalten? Wie programmiert man dieses "auf einen Job warten"?
Oder kann man FreeOnTerminate auf False setzen und den Thread etwa mehrmals hintereinander mit Resume starten?
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Thread - Problem

  Alt 16. Okt 2006, 20:30
Hi,
Schau mal hier(letzter Post):
Thread and Jobs

Ich hoffe das hilft dir.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
engel

Registriert seit: 13. Nov 2004
Ort: Lüneburg
25 Beiträge
 
Delphi 3 Professional
 
#8

Re: Thread - Problem

  Alt 30. Okt 2006, 11:37
Zitat:
Schau mal hier(letzter Post):
Thread and Jobs

Danke, das mit den Job's probier ich mal aus.

Aber die Lösung meines Problems ist einfach nur: In der OnTerminate-Ereignisprozedur den Thread auf NIL setzen (sonst nix)!

Matthias
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:13 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