我正在尝试在我的应用程序中进行冗长的操作时显示指示叠加(旋转圆点)的活动。为此,我创建了一个带有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;
答案 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图像组件, 我把一个很长的操作放在一个计时器里面 在单独的线程中执行)。
简单但有效。