如何动态增加 运行 线程的数量并使用列表等待它们?
How to increment the number of running threads dynamically and wait for them using a list?
我想创建一个线程列表并在每个时间间隔(取决于某些条件)更改 运行 线程的数量,使用 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;
但是,我遇到了一些问题:
Incompatible types pointer and cardinal in : ListOfThreadsH.add (HandleThread);
,我能理解为什么我得到这个但真的不知道如何解决它。
这样等待线程是否正确?因为据我所知 ListOfThreadsH
类型必须是 array of THandle
。如果不是,在这种情况下如何等待线程?
如果这不是增加 运行 线程数的正确方法,那么如何进行?感谢您的回复。
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;
我想创建一个线程列表并在每个时间间隔(取决于某些条件)更改 运行 线程的数量,使用 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;
但是,我遇到了一些问题:
Incompatible types pointer and cardinal in :
ListOfThreadsH.add (HandleThread);
,我能理解为什么我得到这个但真的不知道如何解决它。这样等待线程是否正确?因为据我所知
ListOfThreadsH
类型必须是array of THandle
。如果不是,在这种情况下如何等待线程?
如果这不是增加 运行 线程数的正确方法,那么如何进行?感谢您的回复。
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;