'工作,请等待'屏幕与线程?

时间:2010-01-16 15:50:36

标签: delphi multithreading adsi

也许,这对你来说很容易,但是我正在努力研究一个用TADSISearch组件查询adsi的项目(用于教育目的),为期数天。当TADSISearch正在搜索Active Directory时,我正试图在Form2上显示一个“正在工作,请稍候......”启动画面,其中包含一名男工GIF动画。虽然我根据我尝试了各种可能性,但我无法成功。我试图在一个线程中使用TADSISearch,但是在ADSIsearch完成之前线程正在终止。我认为TADSISearch不是线程安全的。你怎么看?另外,我创建Form2并使用线程更新它的另一种方式,但动画gif停止,而主要表单去了adsi搜索。你能说些什么呢?如何在ADSISearch工作时制作一个请等待屏幕并保持主窗体响应。 Application.ProcessMessages或计时器也不是一种方式。非常感谢阅读和回答。

4 个答案:

答案 0 :(得分:9)

图形用户界面应由主线程更新。您应该将搜索代码放入一个单独的线程中,当搜索线程正在运行时,您的主线程可以显示动画以及“请稍候”消息。

当搜索通过任何可用的同步技术完成时,您的搜索者线程可以通知主线程。最简单的方法是在线程类中定义一个方法,该方法在用户界面中停止动画,并在搜索器线程的Execute方法结束时将该方法传递给Synchronize。

您的搜索者线程代码将是这样的:

type
  TMyThread = class(TThread)
  private
    procedure NotifyEndOfThread;
  protected
    procedure Execute; override;
  end;

implementation

uses MainFormUnit;

procedure TMyThread.NotifyEndOfThread;
begin
  MainForm.ShowAnimation := False;
end;

procedure TMyThread.Execute;
begin
  try
    {Add your search code here}
  finally
    Synchronize(NotifyEndOfThread);
  end;
end;

你的主线程代码将是这样的:

TMainForm = class(TForm)
...
private 
  FShowAnimation : Boolean;
  procedure SetShowAnimation(Value: Boolean);
public
  property ShowAnimation : Boolean read FShowAnimation write SetShowAnimation;
end;

procedure TMainForm.SetShowAnimation(Value: Boolean);
begin
  FShowAnimation := Value;
  if FShowAnimation then
    {Add animation code here}
  else
    {Stop animation}
end;

答案 1 :(得分:3)

也许你可以试试这个:

Delphi的螺纹防溅屏
http://cc.embarcadero.com/Item/20139

我在触摸屏/终端应用程序(瘦客户端,Wifi,RemObjects等)上使用它,它很好用! 还有一个动画GIF工作。

答案 2 :(得分:1)

如何在搜索完成之前终止线程?如果在线程中执行搜索,并且您只有一个线程实例,那么它应该可以工作。

答案 3 :(得分:-1)

你能不能做一个

f := TMyWaitForm.Create(self);
try
   f.Show();
   ...start the TADSISearch...
finally
   FreeAndNil(f);
end;

在TMyWaitForm(显示自己)上放置动画GIF?

我在网络创建计划中构建网站时有一个进度表,这就像一个魅力。

您甚至可以考虑在等待表单上显示一些状态信息(如果TADSISearch组件/软件具有可以分配的回调函数或事件)。

显示一个显示进程所用时间的运行时钟,也是一个不错的选择。