如何动态增加运行线程的数量并使用列表等待它们?

时间:2016-03-17 19:23:00

标签: multithreading delphi delphi-2010 waitformultipleobjects

我想创建一个线程列表并在每个时间间隔内更改正在运行的线程数(取决于某些条件),这是使用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。如果没有,在这种情况下如何等待线程?

如果这不是增加正在运行的线程数的正确方法,那么如何继续?谢谢你的回复。

1 个答案:

答案 0 :(得分: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;