我知道定时器是由执行的周期性动作,但我不知道,如果计时器是在一个线程来执行定期操作的最佳方式,我想要做的是正从工作线程的一些信息,要更清楚:有一个主线程需要获得另一个线程(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
withing这个循环,那么假设我有许多工人:,它宁愿:
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没有问题,因为我必须计算每次迭代的结果并确定其新值。
我希望我在我解释清楚。
感谢您的回复。
最简单的方法是在循环中调用“Sleep(1000)”,在每次循环迭代中执行您的操作。或者,使用'CreateWaitableTimer()'和'WaitForSingleObject()'而不是'Sleep()'。 –
你为什么认为计时器不是最好的方法? –
抱歉不清楚,请参阅我的编辑。 – Safa