我知道定时器是执行定期操作的,但我不确定定时器是否是在线程中执行定期操作的最佳方式,我尝试做的是从中获取一些信息工作线程,更清楚:有一个主线程需要获得另一个线程(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;
所以,我想要实现的是:主线程必须在以下情况下退出循环:
我希望我的解释清楚。
感谢您的回复。
答案 0 :(得分:4)
WaitForMultipleObjects
确实是你应该调用的函数。但问题是你没有检查返回值。无论何时调用Windows API函数,这都是经验法则:
始终检查函数返回的值。
如果遵循该规则,您将避免很多问题。
在这种情况下,documentation表示在True
传递bWaitAll
时:
GetLastError
以了解原因。请注意,您无需担心 WAIT_ABANDONED_0 到( WAIT_ABANDONED_0 + nCount- 1)情况,因为您没有传递任何互斥对象。