【发布时间】:2016-03-05 15:55:18
【问题描述】:
我知道定时器是用来执行周期性动作的,但我不确定定时器是否是在线程中执行周期性动作的最佳方式,我想要做的是从工作线程获取一些信息,以更清楚一点:有一个主线程需要获取另一个线程(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,所以假设我有很多工人:,它宁愿是:
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 s 并获取新值。
- 条件为假。 我将条件设置为 false 没有问题,因为我必须在每次迭代中计算一些东西并确定它的新值。
我希望我的解释很清楚。
感谢您的回复。
【问题讨论】:
-
最简单的方法是在循环中调用
Sleep(1000),在每个循环迭代中执行您的操作。或者,使用CreateWaitableTimer()和WaitForSingleObject()而不是Sleep()。 -
为什么你认为计时器不是最好的方法?
-
抱歉不清楚,请参阅我的编辑。
标签: delphi winapi delphi-2010