AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign WaitForMultipleObjects erkennt Beendigung von Threads nicht

WaitForMultipleObjects erkennt Beendigung von Threads nicht

Ein Thema von Pussyranger · begonnen am 13. Feb 2012 · letzter Beitrag vom 16. Feb 2012
Antwort Antwort
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#1

WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 13. Feb 2012, 20:24
Hallo, ich bins mal wieder!

Ich erstelle unterschiedlich viele Threads, auf deren Beendigung das Programm warten soll. Bisher hab ich immer über das OnTerminate-Ereignis der Threads die Anzahl der Threads runtergezählt und mit
Delphi-Quellcode:
while ThreadAnzahl > 0 do
begin
  Sleep(1);
  Application.ProcessMessages;
end;
auf die Threads gewartet. Nun ist das natürlich höchst unschön und ich denke, dass es mit WaitForMultipleObjects effizienter wäre.
Leider kapiert WaitForMultipleObjects aber nie, dass die Threads beendet wurden

Hier die Prozedur, in der die Threads erzeugt werden:
Delphi-Quellcode:
function Unterschiede_markieren(Bild1, Bild2: TBitmap; Blend: Real; Toleranz: Byte):TBitmap;
VAR i,j,Breite,Hoehe,Itert:integer; B1,B2: ColorArray; SysInfo: TSystemInfo; HandleArray: array of THandle;
begin
  GetSystemInfo(SysInfo);
  ThreadCount:=SysInfo.dwNumberOfProcessors;
  SetLength(Thread, ThreadCount);
  SetLength(HandleArray, Threadcount);

  result:=TBitmap.Create;
  if NOT Assigned(fertig_Bild) then fertig_Bild:=TBitmap.Create;
  fertig_Bild.Width:=Bild2.Width;
  fertig_Bild.Height:=Bild2.Height;

  for i := 0 to ThreadCount-1 do
  begin
    Thread[i]:=TDifference_Finder.Create(Bild1, Bild2, Round(i*Bild2.Height/ThreadCount), Round((i+1)*(Bild2.Height-1)/ThreadCount), Blend, Toleranz, true);
    HandleArray[i]:=Thread[i].Handle;
    Thread[i].FreeOnTerminate:=true;
    Thread[i].Resume;
  end;

  WaitForMultipleObjects(Length(HandleArray), @HandleArray[0] ,true, INFINITE);

  result.Assign(fertig_Bild);
end;
LG,

Pussyranger
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 13. Feb 2012, 21:07
EDIT: Rufst du in den Threads synchronize oder ähnliches auf? Das könnte einen netten Deadlock geben.

[EDIT]Vermutlich Blödsinn: [/EDIT]
Könnte es sein, dass ein Thread schon fertig ist, wenn WaitForMultipleObjects aufgerufen wird?
Wie sich WaitForMultipleObjects dann verhält, habe ich nicht gefunden. Rufe mal am Ende des Threads ein sleep(1000); (bzw. einen Zeitraum, indem das Warten auf jeden Fall ausgelöst wird) auf und gucke, ob das dass Problem behebt.

Geändert von BUG (13. Feb 2012 um 21:20 Uhr)
  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
 
#3

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 13. Feb 2012, 22:26
Irgendwie ja schon komisch ... da wird die Berechnung in den Hintergrund geschickt und im Vordergrund wird der Thread schlafen gelegt ... irgendwie hatte ich das mit den Threads anders in Erinnerung ...

Ab in den Hintergrund und wenn alle fertig sind - Reaktion auf das OnTerminate-Event - dann die Ergebnisse zusammentragen und ausgeben.
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 x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#4

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 14. Feb 2012, 02:26
Moin moin,

hast du geprüft, ob wirklich alle Threads beendet sind?
Peter
-= Gruss Peter =-
-= alias x000x =-
  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
 
#5

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 14. Feb 2012, 04:30
Eventuell gibt es aber auch eine Zugriffsverletzung in den Threads, da ja die Threads auf die gleichen Objekte zugreifen (Bild1, Bild2) ... und sogar noch auf fertig_bild!

TBitmap ist nicht threadsicher ... das hatten wir doch schon
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 Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#6

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 16. Feb 2012, 14:32
Sleep(1000); bewirkt nichts.
Da alle Threads zumindest das OnTerminate-Ereignis auslösen, nehme ich an, dass die Threads dann auch beendet werden.
Eine Zugriffsverletzung gibt es denke ich nicht, denn bisher hat ja alles wunderbar funktioniert. Die Threads werden synchronisiert, bevor auf fertig_Bild zugegriffen wird.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#7

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 16. Feb 2012, 14:47
Die Threads werden synchronisiert, bevor auf fertig_Bild zugegriffen wird.
So wie ich synchronize verstanden habe, wartet es, bis der Main-Thread wieder im Messageloop ist, um dann sicher die übergebene Prozedur ausführen zu können.
Dein Main-Tread wartet allerdings auf deine Arbeitsthreads.
Klassischer Deadlock.
  Mit Zitat antworten Zitat
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#8

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 16. Feb 2012, 16:44
Am Synchronize hats gelegen! Allerdings muss ich ja irgendwie die Teilbilder zusammenfügen.
Übers OnTerminate-Ereignis geht es nicht, da das auch zu einem DeadLock führen würde.
Nun habe ich die Deklaration für die Teilbilder in den public-Bereich geschrieben.
Wenn WaitForMultipleObjects beendet ist, rufe ich folgenden Code auf:
Delphi-Quellcode:
for i := 0 to ThreadCount-1 do
begin
  fertig_Bild.Canvas.Draw(0, Thread[i].StartYt, Thread[i].Finish);
  Thread[i].Finish.Free;
end;
Trotzdem wird der Speicher von Finish nicht wieder freigeben. Wieso?

Edit: FreeOnTerminate hab ich auf false gesetzt.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 16. Feb 2012, 17:14
Trotzdem wird der Speicher von Finish nicht wieder freigeben. Wieso?
Woran erkennst du denn, das der Speicher nicht freigegeben wird?
Die Zahl im Taskmanager muss auf solche Änderung nicht reagieren.
  Mit Zitat antworten Zitat
Benutzerbild von Pussyranger
Pussyranger

Registriert seit: 15. Mär 2011
25 Beiträge
 
Delphi XE2 Architect
 
#10

AW: WaitForMultipleObjects erkennt Beendigung von Threads nicht

  Alt 16. Feb 2012, 17:41
Ich wollte die Prozedur 100 Mal hintereinander aufrufen. Dabei hat mir der Taskmanager für das Programm zwar immer maximal 800MB angezeigt, aber die Auslastung des RAM insgesamt ist kontinuierlich bis auf 100% gestiegen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf