如何在线程中每秒执行一次操作?

时间:2016-03-05 15:55:18

标签: delphi winapi delphi-2010

我知道定时器是执行定期操作的,但我不确定定时器是否是在线程中执行定期操作的最佳方式,我尝试做的是从中获取一些信息工作线程,更清楚:有一个主线程需要获得另一个线程(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个seconde,则不需要获取该属性值),这就是为什么我不应该&# 39;这样做。 我还考虑过使用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秒并得到新的价值。
  • 条件是假的。 我将条件设置为false没有问题,因为我必须计算每次迭代的内容并确定其新值。

我希望我的解释清楚。

感谢您的回复。

1 个答案:

答案 0 :(得分:4)

WaitForMultipleObjects确实是你应该调用的函数。但问题是你没有检查返回值。无论何时调用Windows API函数,这都是经验法则:

  

始终检查函数返回的值。

如果遵循该规则,您将避免很多问题。

在这种情况下,documentation表示在True传递bWaitAll时:

  • WAIT_OBJECT_0 的返回值为( WAIT_OBJECT_0 + nCount- 1)表示函数返回,因为所有指定的对象都已发出信号。
  • WAIT_TIMEOUT 的返回值表示由于指定的超时时间已经过去而返回的函数。
  • 返回值 WAIT_FAILED 表示由于某种原因呼叫失败,您应该致电GetLastError以了解原因。

请注意,您无需担心 WAIT_ABANDONED_0 到( WAIT_ABANDONED_0 + nCount- 1)情况,因为您没有传递任何互斥对象。