让Delphi TTimer与多线程应用程序配合使用

The*_*ude 3 delphi multithreading vcl timer omnithreadlibrary

我有一个问题,一个简单的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;
Run Code Online (Sandbox Code Playgroud)

当我在一个简单的项目/演示中执行代码时,Everthing工作正常,但在我的应用程序(使用Omni Thread Library v3)中,timer事件永远不会被触发

我很确定这没什么,我只是想不通是什么问题!

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

我正在使用Delphi 2010

谁知道如何解决这个问题?

Rem*_*eau 7

TTimer是一个基于消息的计时器.无论TTimer创建的线程上下文是什么,都必须具有活动的消息循环才能TTimer处理其WM_TIMER消息.

TTimer不是一个线程安全的计时器.为了接收WM_TIMER消息,它必须HWND为自己分配一个窗口句柄.它使用VCL的AllocateHWnd()函数,它不是线程安全的,不能从主线程的上下文之外调用.

如果你需要一个线程安全定时器,可以CreateWindow()直接调用并直接泵送/处理WM_TIMER消息,或者使用不同的定时器机制,例如线程多媒体定时器timeSetEvent(),或者甚至只是一个简单的繁忙循环通过Sleep()WaitForSingleObject().在不知道您使用计时器的情况下,很难确定适合您需求的替代方案.

  • @warren它是异步的 (2认同)