AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WaitForMultipleObjects funktioniert irgendwie nicht
Thema durchsuchen
Ansicht
Themen-Optionen

WaitForMultipleObjects funktioniert irgendwie nicht

Ein Thema von MicAlter · begonnen am 20. Apr 2010 · letzter Beitrag vom 20. Apr 2010
 
MicAlter

Registriert seit: 29. Aug 2007
12 Beiträge
 
#1

WaitForMultipleObjects funktioniert irgendwie nicht

  Alt 20. Apr 2010, 11:56
Hallo zusammen,

irgendwie funktioniert die SuFu nicht richtig... Suche nach "WaitForMultipleObjects" gibt kein Ergebnis zurück, obwohl ein solches Thema bereits existiert.

Ist aber nicht ganz mein Thema:

Ich möchte mehrere Worker-Threads für eine Suchfunktion benutzen und auf deren Ende warten. Jeder Thread liefert mir ein Ergebnis zurück welches ich auswerten möchte. Dafür ist, denke ich zumindest, die Funktion WaitForMultipleObjects gedacht.

Hier mein Code:
Delphi-Quellcode:

TMyThread.Constructor( nMaxLaufzeit : Integer; AMemo : TMemo );
begin
  inherited Create( True );
  FMaxLaufzeit := nMaxLaufzeit;
  FMemo := AMemo;
  FreeOnTerminate := True;
  Resume;
end;

TMyThread.ShowThreadStatus;
begin
  Memo.Lines.Add( Format('Alive from thread %d, %d of %d',[self.Handle,FCurrent,FMaxLaufzeit]) );
end;

TMyThread.Execute;
begin
  FCurrent := FMaxLaufzeit;
  while not Terminated do
  begin
    Sleep(1000);
    Synchronize(ShowThreadStatus);
    Dec( FCurrent );

    if FCurrent < 1 then
       Terminate;
  end;
end;


const MAX = 5;
var
   ThreadList : array[0..MAX-1] of TMyThread;
   ThreadHandles : array[0..MAX-1] of THandle;
   i,ThreadsRunning : Integer;
   dw,idx : DWord;

   //Threads erzeugen und Handle-Liste füllen
   for i := 0 to MAX-1 do
   begin
     //Max. Laufzeit des Threads in Sekunden mitgeben
     ThreadList[i] := TMyThread.Create( (i+1)*3 );
     ThreadHandles[i] := ThreadList[i].Handle;
   end;

   ThreadsRunning := MAX;
   while ThreadsRunning > 0 do
   begin
     //dw := WaitForMultipleObjects( MAX, @ThreadHandles, false, 0); //gleiches Ergebnis
     dw := WaitForMultipleObjects( MAX, @ThreadHandles[0], false, 0);

     if (dw <> WAIT_TIMEOUT) AND
        (dw <> WAIT_FAILED) then
     begin
       //Array-Index des auslösenden Threads errechnen
       idx := dw - WAIT_OBJECT_0;
       if idx < MAX then
       begin
         Memo.Lines.Add( Format('Thread %d (Handle:%d) beendet.',[idx,ThreadHandles[idx]]) );
         Dec( ThreadsRunning );
       end;
     end;

     Application.ProcessMessages;
   end;
Die Threads geben nun ihre Statusmeldungen korrekt aus. So weit so gut.
Nun erwarte ich, dass ich für jeden Thread, der sich beendet ein "Signal" bekomme. Ist aber leider nicht so
Einmal bekomme ich ein "gültigen" Index (2), danach immer nur WAIT_FAILED?

Verstehe ich den Sinn der Funktion ncht richtig oder mache ich irgendwas falsch?

lg,
Michael
  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 01:08 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