Я знаю, что таймеры созданы для выполнения периодических действий, но я не уверен, являются ли таймеры лучшим способом выполнения периодических действий в потоке, я пытаюсь получить некоторую информацию из рабочих потоков, чтобы быть яснее: есть основной поток, которому нужно получить свойство другого потока (woker), это вариант, поэтому мне нужно получать его значение каждый интервал времени. это что-то вроде:
procedure mainThread.execute;
begin
// every second :
val := workerThread.property;
end;
Обычно основной поток должен подождать секунду, а затем получить значение, например:
procedure mainThread.execute;
begin
while (condition) do
begin
sleep(1000);
val := workerThread.property;
end;
Но что, если рабочий поток завершается, а основной поток все еще ожидает получения значения sleep(1000)
, это приведет к потере времени, потому что основной поток должен немедленно выйти из цикла, когда рабочий поток завершится. Я не хочу, чтобы основной поток ждал, если рабочий поток уже завершил свою работу (нет необходимости получать значение этого свойства, если рабочий поток занимает менее 1 секунды), поэтому я не должен делать это таким образом. Я также думал об использовании waitformultipleobjects
в этом цикле, поэтому, предполагая, что у меня много worker:, это будет:
procedure mainThread.execute;
begin
while (condition) do
begin
waitForMultipleObjects(Threads, @Array, True, 1000);
//If elapsed Time < 1000 , this means that all threads terminated, then main thread must quit this loop
//If elapsed Time = 1000 :
val := workerThread.property;
// Calculate the new value of condition
end;
Итак, чего я хочу добиться, так это: основной поток должен выйти из цикла, только если:
- все рабочие потоки завершены (сразу после их завершения): пока основной поток ожидает получения значения свойства, если потоки завершаются, основной поток выходит из цикла, если нет, он продолжает ждать, пока не истечет время = 1 с, и получить новое значение .
- условие ложно. У меня нет проблем с установкой условия в false, потому что я должен вычислять что-то на каждой итерации и определять его новое значение.
Надеюсь, я был понятен в своем объяснении.
Спасибо за ваши ответы.