WaitForMultipleObjects and 64 threads

545 views Asked by At

According to Microsoft's documentation MAXIMUM_WAIT_OBJECTS is 64 (the maximum of handles to wait for) but for some reason sometimes (because randomly) WaitForMultipleObjects returns WAIT_FAILED ($FFFFFFFF) and GetLastError returns ERROR_INVALID_HANDLE (6). What am I doing wrong?

procedure TForm1.Button1Click(Sender: TObject);
var ArrayOfHandles:array of THandle;
    Threads,x:byte;
    ReturnValue:Cardinal;
begin

  Threads:=64;
  SetLength(ArrayOfHandles,Threads);

  for x:=0 to Threads-1 do
  begin
    WorkerThread:= TWorkerThread.Create(True);
    ArrayOfHandles[x]:=WorkerThread.Handle;
    WorkerThread.FreeOnTerminate:=true;
    WorkerThread.Priority := tpNormal;
    WorkerThread.Resume;
  end;

  ReturnValue:=WaitForMultipleObjects(Threads,@ArrayOfHandles[0],false,INFINITE);
  ShowMessage('ReturnValue='+IntToStr(ReturnValue)+#13+'GetLastError='+IntToStr(GetLastError));

end;

procedure TWorkerThread.Execute;
begin

  sleep( Random(1000) );

end;
1

There are 1 answers

1
Atak_Snajpera On

Ok. I'm an idiot. This MUST be false!

WorkerThread.FreeOnTerminate:=false;