gpt4 book ai didi

multithreading - 让 Delphi TTimer 与多线程应用程序一起工作

转载 作者:行者123 更新时间:2023-12-03 15:46:45 25 4
gpt4 key购买 nike

我有一个简单的 TTimer 问题,它启动并在主应用线程中执行其 OnTimer 事件,代码如下所示:

procedure TForm1.DoSomeStuff();
begin
OmniLock.Acquire;
try
Parallel.Pipeline.NumTasks(MaxThreads).Stage(StageProc).Run;

if (MyTimer = nil) then
begin
MyTimer := TTimer.Create(nil);
MyTimer.Interval := 60 * 1000; // timer fired every 60 seconds
MyTimer.OnTimer := MyTimerEvent;
MyTimer.Enabled := True;
end;
finally
OmniLock.Release;
end; // try/finally
end;

当我在简单的项目/演示中执行代码时,一切正常,但在我的应用程序(使用 Omni Thread Library v3)中,计时器事件从未触发

我很确定没什么,我只是不知道出了什么问题!

我三次检查:MyTimer 在我的代码中仅分配一次,其 OnTimer 事件已正确分配,等等...

我使用的是 Delphi 2010

有人知道如何解决这个问题吗?

最佳答案

TTimer 是一个基于消息的计时器。无论在哪个线程上下文中创建 TTimer,都必须有一个事件消息循环,以便 TTimer 处理其 WM_TIMER 消息。

TTimer 不是线程安全的计时器。为了接收WM_TIMER消息,它必须为自己分配一个HWND窗口句柄。它使用 VCL 的 AllocateHWnd() 函数来执行此操作,该函数不是线程安全的,并且不得从主线程上下文之外调用。

如果您需要线程安全的计时器,请直接调用 CreateWindow() 并直接泵送/处理 WM_TIMER 消息,或者使用不同的计时器机制,例如通过 timeSetEvent() 作为线程多媒体计时器,或者甚至只是通过 Sleep()WaitForSingleObject() 的简单繁忙循环。如果不知道计时器的用途,就很难找到适合您需求的替代方案。

关于multithreading - 让 Delphi TTimer 与多线程应用程序一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10589749/

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