1

我想创建一个线程列表并更改每个时间间隔的运行线程数(取决于某些条件),这是不可能的,array of THandle因为 - 如你所知 - 这里我需要在创建线程之前修复数组的长度,这就是我进行的方式:

procedure MainThread.execute;
var 
  HandleThread : THandle;
  ListOfThreadsH : TList;
begin
  ListOfThreadsH := TList.create;              
  while (condition) do
  begin
    HandleThread := TMyThread.Create( parameter1,..,parametern).Handle;
    ListOfThreadsH.add (HandleThread);
    ThreadCount := ThreadCount + 1;
  end;
  waitForMultipleObjects(ThreadCount, pointer(ListOfThreadsH), True, INFINITE);
end;

但是,我对此有一些问题:

  • : 中不兼容的类型指针和基数ListOfThreadsH.add (HandleThread);,我可以理解为什么我会得到这个,但真的不知道如何解决它。

  • 以这种方式等待线程是否正确?因为据我所知ListOfThreadsH类型必须是array of THandle. 如果没有,在这种情况下如何等待线程?

如果这不是增加运行线程数的正确方法,那么如何进行?感谢您的回复。

4

1 回答 1

1

array of ...是动态的,您可以随时更改其大小,例如:

procedure MainThread.execute;
var 
  ListOfThreads : TObjectList;
  ArrOfHandles : array of THandle;
  Thread : TMyThread;
begin
  ListOfThreads := TObjectList.Create(True);
  try
    while (condition) do
    begin
      Thread := TMyThread.Create(...);
      ListOfThreads.Add(Thread);
      SetLength(ArrOfHandles, Length(ArrOfHandles) + 1);
      ArrOfHandles[High(ArrOfHandles)] := Thread.Handle;
    end;
    WaitForMultipleObjects(Length(ArrOfHandles), PWOHandleArray(Pointer(ArrOfHandles)), True, INFINITE);
  finally
    ListOfThreads.Free;
  end;
end;

或者:

procedure MainThread.execute;
var 
  ListOfThreads : TObjectList;
  ListOfHandles : TList<THandle>;
  Thread : TMyThread;
begin
  ListOfThreads := TObjectList.Create(True);
  try
    ListOfHandles := TList<THandle>.Create;
    try
      while (condition) do
      begin
        Thread := TMyThread.Create(...);
        ListOfThreads.Add(Thread);
        ListOfHandles.Add(Thread.Handle);
      end;
      WaitForMultipleObjects(ListOfHandles.Count, PWOHandleArray(Pointer(ListOfHandles.ToArray)), True, INFINITE);
    finally
      ListOfHandles.Free;
    end;
  finally
    ListOfThreads.Free;
  end;
end;
于 2016-03-17T22:08:39.503 回答