获得德尔福TTimer与多线程应用程序的工作(Getting a Delphi TTimer to

2019-09-17 05:09发布

我与同时启动,有其OnTimer事件在主应用程序线程执行一个简单的TTimer的问题,代码如下:

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;

寄托都工作得很好,当我执行在一个简单的项目/演示代码,但在我的应用程序(它使用全线程库第三版),定时器事件从来没有发射

我敢肯定, 这没有什么 ,我只是无法弄清楚什么是错的!

我三重检查: MyTimer只在我的代码分配一次,它的OnTimer事件已被正确分配,等等。

我用Delphi 2010

任何人都知道如何解决这个问题?

Answer 1:

TTimer是基于消息的定时器。 不管线程上下文的TTimer被创建在必须有活动的消息循环,以便TTimer处理其WM_TIMER消息。

TTimer是不是线程安全的计时器。 为了接收所述WM_TIMER消息,它具有分配一个HWND窗口句柄本身。 它这样做是使用VCL的AllocateHWnd()函数,这是不是线程安全的,不得在主线程的上下文之外调用。

如果你需要一个线程安全计时器,或者调用CreateWindow()的直接和泵/过程WM_TIMER直接邮件,或者使用不同的定时器机制,如通过螺纹多媒体定时器timeSetEvent()甚至只是一个简单的忙循环经由Sleep()WaitForSingleObject() 不知道你正在使用的计时器什么,所以很难针点适合您的需求的替代品。



文章来源: Getting a Delphi TTimer to work with a multi-threading app