Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prüfen wann alle Threads beendet wurden (https://www.delphipraxis.net/33731-pruefen-wann-alle-threads-beendet-wurden.html)

endeffects 12. Nov 2004 15:51

Re: Prüfen wann alle Threads beendet wurden
 
hallo,

ich hab das ganze nun mal mit WaitForMultipleObjects probiert,
allerdings scheint hier nicht wirklich gewartet zu werden =(

mein code ist folgender:

Delphi-Quellcode:
procedure TMainForm.LunchThreadds;
var i: integer; Mylist: TStringlist;
    hndlArray : Array of THandle;
begin
  ...
  //erstmal wird Mylist eingelesen und geschaut ob noch threads laufen
  ...
  Setlength(MyThreadArray, StrToInt(edtThreads.Text));
  Setlength(hndlArray, StrToInt(edtThreads.Text));

    while Mylist.Count-1 > 0 do
    begin
      for i := 0 to length(MyThreadArray) - 1 do
      begin
        MyThreadArray[i] := TMyThreads.Create(true);
        MyThreadArray[i].FIndex := i;
        MyThreadArray[i].FValue := Myylist[0];
        MyThreadArray[i].Priority := tpIdle;
        MyThreadArray[i].FreeOnTerminate := True;
        hndlArray[i] := MyThreadArray[i].Handle;
        MyThreadArray[i].Resume;
        Mylist.Delete(0);
      end;
      //die ersten threads durchlaufen und warten bis diese beendet sind
      //um dann die nächsten threads zu initialisieren
      WaitForMultipleObjects(StrToInt(edtThreads.Text), @hndlArray, True, 60000);
    end;
    Myylist.Free;

end;
jemand eine idee wo nun der denkfehler ist?

endeffects 12. Nov 2004 16:22

Re: Prüfen wann alle Threads beendet wurden
 
ich hab folgendes tutorial genutzt:
http://www.delphicorner.f9.co.uk/articles/op1.htm

dort steht unter anderem:
Zitat:

Those couple of Windows API functions are called WaitForSingleObject and WaitForMultipleObjects. These two functions are used to wait for objects to enter a signaled state before they return. Okay, what's signaled mean anyway? ... Essentially, when an object is created in Windows, it is given a system assigned state property of sorts. While it is active or in use, it is said to be non-signaled. When it is available, it is said to be signaled.
ich hab das nun so verstanden das solange der thread arbeitet kein "signal" für diesen
thread gesetzt ist, das wäre dann also erst der fall wenn er abgearbeitet wurde
und genau darauf soll ja nun WaitForMultipleObjects warten :gruebel:

endeffects 12. Nov 2004 20:05

Re: Prüfen wann alle Threads beendet wurden
 
also das problem, wie ich mir sagen lassen habe, lag am dynamischen
array das an die api funktion übergeben wird, folgender
code funktionier nun anscheinend:

Delphi-Quellcode:
procedure TMainForm.LunchThreads;
var
i, hndlArraylength: integer;
Mylist: TStringlist;
hndlArray : Array[0..63] of THandle;
begin
...
//prüfen ob threads laufen und stringliste laden
...
    Setlength(ThreadArray, 64));
    while Mylist.Count > 1 do
    begin
      for i := 0 to length(ThreadArray) - 1 do
      begin
        ThreadArray[i] := TMyThreads.Create(true);
        hndlArray[i] := ThreadArray[i].Handle;
        ThreadArray[i].FIndex := i;
        ThreadArray[i].FValue := Mylist[0];
        ThreadArray[i].Priority := tpIdle;
        ThreadArray[i].FreeOnTerminate := True;
        ThreadArray[i].Resume;
        if Mylist.Count > 1 then
          Mylist.Delete(0)
        else
          break;
      end;
      WaitForMultipleObjects(64, @hndlArray, True, 20000);
    end;
    Mylist.Free;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz