2010-09-02 49 views
1

我正在尝试在我的应用程序中进行漫长操作期间显示一个指示叠加(点的旋转圆圈)的活动。为此,我创建了一个带有TImage和Imagelist的无边框透明窗体,我在主线程忙时尝试在线程中进行更新。TThread.Execute未按预期方式调用

我遇到的问题是,冗长的操作似乎没有得到我的线程'interupted'。 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; 

回答

3

你正在做大量的工作线程的同步(),里面这代表了回到主线程。如果主线程的冗长操作不处理来自消息队列的新消息,则Synchronize()必须等待。这就是为什么你的线程在冗长的操作运行时不会做任何事情。

你的代码是如何有效地使用线程的一个不好的例子。什么,你应该做的,而不是在线程中执行冗长的操作本身,并让同时线程运行时,主线程处理用户界面更新,如:

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; 
+0

谢谢你的解释。 – sum1stolemyname 2010-09-03 07:05:33

2

我用GIF图像组件,可以显示动画GIF (http://www.tolderlund.eu/delphi/), 和我把一个冗长的操作在一个定时器(其中 在单独的线程中执行)。

简单但有效。

+0

这就是我首先想到的,但我不能在我的项目中使用第三方组件(因为政治) – sum1stolemyname 2010-09-09 08:35:56