gpt4 book ai didi

delphi - 如何在线程中每秒执行一个 Action ?

转载 作者:行者123 更新时间:2023-12-03 18:26:09 26 4
gpt4 key购买 nike

我知道定时器是用来执行周期性 Action 的,但我不确定定时器是否是在线程中执行周期性 Action 的最佳方式,我想要做的是从工作线程获取一些信息,以便更清楚:有一个主线程需要获取另一个线程(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 没有问题,因为我必须在每次迭代中计算一些东西并确定它的新值。

  • 我希望我的解释很清楚。

    感谢您的回复。

    最佳答案

    WaitForMultipleObjects确实是您应该调用的函数。你的问题是你没有检查返回值。以下是调用 Windows API 函数时的经验法则:

    Always check the value returned by the function.



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

    在这种情况下, documentation说,当通过 True对于 bWaitAll :
  • 返回值 WAIT_OBJECT_0 to ( WAIT_OBJECT_0 + nCount– 1) 表示函数返回,因为所有指定的对象都已发出信号。
  • 返回值 WAIT_TIMEOUT 表示函数由于指定的超时时间而返回。
  • 返回值 WAIT_FAILED 表示由于某种原因调用失败,您应该调用 GetLastError找出原因是什么。

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

    关于delphi - 如何在线程中每秒执行一个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816243/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com