未按预期调用TThread.Execute

时间:2010-09-02 10:08:09

标签: multithreading delphi delphi-2010

我正在尝试在我的应用程序中进行冗长的操作时显示指示叠加(旋转圆点)的活动。为此,我创建了一个带有TImage和Imagelist的无边框透明表单,我想在主线程忙的时候在一个线程中更新。

我遇到的问题是冗长的操作似乎没有被我的线程“中断”。 thread.Execute函数在冗长的操作开始之前循环几次,然后在操作完成时再次循环。

似乎线程由于某种原因而饿死了。我试图提高它的优先级,但看不出任何效果。

有没有人有类似的经验可以分享,甚至可能是解决方案?


线程功能的源代码

procedure TIndicatorThread.Execute;
begin
  inherited;
  while(not Terminated) do
    begin
      fDlg.fCurindex := (fDlg.fCurindex+1) mod 12;
      Synchronize(UpdateImage);
      Application.ProcessMessages;
      sleep(80);
    end;
    Synchronize(fDlg.close);
    Synchronize(fDlg.Free);
end;

主要帖子

begin
[...]
myThread := TIndicatorThread.Create;
mythread.Resume;

Init_SomeUIRelatedstuff;
Application.ProcessMessages;

DoLengthyOperation; 

mythread.Terminate;

2 个答案:

答案 0 :(得分:3)

你正在使用Synchronize()内部的大部分线程工作,它将工作委托给主线程。如果主线程的冗长操作不处理来自消息队列的新消息,则Synchronize()必须等待。这就是为什么你的线程在冗长的操作运行时不会做任何事情的原因。

您的代码是如何有效使用线程的一个不好的例子。你应该做的是在线程中执行冗长的操作,并让主线程在线程运行时处理UI更新,例如:

procedure TWorkThread.Execute; 
begin 
  DoLengthyOperation;  
end; 

begin 
  ...
  Init_SomeUIRelatedstuff; 
  Application.ProcessMessages; 

  myThread := TWorkThread.Create(False);
  while WaitForSingleObject(myThread.Handle, 80) = WAIT_TIMEOUT do
  begin 
    fDlg.fCurindex := (fDlg.fCurindex+1) mod 12; 
    UpdateImage; 
    Application.ProcessMessages; 
  end; 
  mythread.Free;

  fDlg.Close; 
  fDlg.Free;

  ...
end;

答案 1 :(得分:2)

我使用了可以显示动画GIF(http://www.tolderlund.eu/delphi/)的GIF图像组件, 我把一个很长的操作放在一个计时器里面 在单独的线程中执行)。

简单但有效。