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);, я могу понять, почему я m получить это, но не знаю, как его решить.

  • Правильно ли ждать потоков таким образом? Потому что, как я знаю, ListOfThreadsH тип должен быть array of THandle. Если нет, как ждать потоков в этом случае?

Если это неправильный способ увеличить количество выполняемых потоков, то как действовать? Спасибо за ваши ответы.

+1

Зачем вам нужно, чтобы зафиксировать длину массива. Вы можете использовать динамический массив. Вы можете использовать общий «TList », чтобы сохранить список объектов потока, если хотите. Вы можете добавить и удалить из этого. Из этого довольно легко создать массив динамиков потоков. Это не имеет ничего общего с потоками. Вы просачиваете память, как сито. –

+0

Вам необходимо проверить возвращаемое значение 'WaitForMultipleObjects', а также не ждать больше, чем' MAXIMUM_WAIT_OBJECTS', что составляет 64 IIRC –

ответ

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;