加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – ‘工作,请等待’屏幕与线程?

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读