【问题标题】:'working, please wait' screen with thread?'工作中,请稍候' 带有线程的屏幕?
【发布时间】:2010-01-16 15:50:36
【问题描述】:

也许,这对您来说很容易,但我正在努力开发一个项目(出于教育目的),该项目使用 TADSISearch 组件查询 adsi,这几天。我正在尝试在 TADSISearch 搜索 Active Directory 时在 Form2 上显示一个带有人工动画 gif 的“工作中,请稍候..”初始屏幕。虽然我根据我的想法尝试了所有可能,但我无法成功。我尝试在线程中使用 TADSISearch,但线程在 ADSIsearch 完成之前终止。我认为 TADSISearch 不是线程安全的。你怎么看?此外,我创建 Form2 并使用线程对其进行更新的另一种方式,但动画 gif 在主表单消失时停止 adsi 搜索。你对这些有什么想说的?我如何在 ADSISearch 工作时制作请等待屏幕并保持主表单响应。 Application.ProcessMessages 或计时器也不是一种方法。非常感谢您的阅读和回答。

【问题讨论】:

  • 你能把你正在使用的代码贴在你的线程上吗?线程似乎不太可能在 TADSISearch 结束之前结束,只有当组件在其自己的线程中工作时才会发生这种情况,而事实并非如此。
  • 正如 Jorge 所说,我们需要查看您的代码,我猜您并没有真正在线程中运行活动目录搜索(您是否将 freeonterminate 设置为 true?)或者正在尝试访问mainform 直接从线程(不同步)。在我们看到你的代码之前不能说更多。
  • 请等周一,谢谢大家的关注..
  • 我发现,当我在线程中使用 ADSISearch 时,会出现错误:无法绑定 LDAP://xxx。在外面,它运行完美。

标签: delphi multithreading adsi


【解决方案1】:

图形用户界面应该由主线程更新。你应该把你的搜索代码放到一个单独的线程中,当搜索线程工作时,你的主线程可以显示动画以及“请稍候”消息。

当搜索通过任何可用的同步技术完成时,您的搜索线程可以通知主线程。最简单的方法是在你的线程类中定义一个方法来停止用户界面中的动画,然后在搜索线程的 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;

【讨论】:

  • 您可以在我提到的 Execute 方法中添加您的 ADSISearch 代码; “{在此处添加您的搜索代码}”。当然我没用过你帖子里提到的TADSISearch组件,也不知道具体是怎么工作的。
【解决方案2】:

也许你可以试试这个:

Delphi 的线程启动画面
http://cc.embarcadero.com/Item/20139

我在触摸屏/终端应用程序(瘦客户端、Wifi、RemObjects 等)上使用它,效果很好! 还可以制作动画 gif。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不知道,我已经问过了。也许是因为 TADSISearch 组件不是线程安全的。
    【解决方案4】:

    你能不能只做一个

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

    在 TMyWaitForm 上放置一个动画 GIF(它会显示自己)?

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

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

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

    【讨论】:

    • 他不能。由于 TADSISearch 在主线程中执行搜索,因此主消息循环不会处理消息,因此 gif 不会更新(也不会更新任何其他类型的用户界面)。
    • 我还尝试在一个线程中使用 TADSISearch 组件来同步更新动画 gif 的表单 (Form2) 为: TMyThread.Execute; var ADSISearch:TADSISearch;开始 ADSISearch 的东西... Synchronize(doUpdate);结尾; TMyThread.doUpdate;开始Form2.Update;结束;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多