Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi ';正在工作,请稍候';丝网?_Delphi_Multithreading_Adsi - Fatal编程技术网

Delphi ';正在工作,请稍候';丝网?

Delphi ';正在工作,请稍候';丝网?,delphi,multithreading,adsi,Delphi,Multithreading,Adsi,也许,这对您来说非常容易,但我正在为一个项目(出于教育目的)努力工作,该项目使用TADSISearch组件查询adsi,为期几天。TADSISearch正在搜索Active Directory时,我正试图在Form2上显示一个“正在工作,请稍候…”的启动屏幕,其中有一个人工动画gif。虽然我根据自己的想法尝试了各种可能性,但我没有成功。我试图在线程中使用TADSISearch,但该线程在ADSIsearch完成之前终止。我认为TADSISearch不是线程安全的。你怎么认为?另外,我用另一种方式

也许,这对您来说非常容易,但我正在为一个项目(出于教育目的)努力工作,该项目使用TADSISearch组件查询adsi,为期几天。TADSISearch正在搜索Active Directory时,我正试图在Form2上显示一个“正在工作,请稍候…”的启动屏幕,其中有一个人工动画gif。虽然我根据自己的想法尝试了各种可能性,但我没有成功。我试图在线程中使用TADSISearch,但该线程在ADSIsearch完成之前终止。我认为TADSISearch不是线程安全的。你怎么认为?另外,我用另一种方式创建了Form2,并使用了一个线程来更新它,但当主窗体消失时,动画gif正在停止adsi搜索。关于这些你能说些什么?当Adisearch正在工作并保持主窗体响应时,如何生成请稍候屏幕。Application.ProcessMessages或timer也不是一种方法。非常感谢您的阅读和回答。

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

您可以不只是执行

f := TMyWaitForm.Create(self);
try
   f.Show();
   ...start the TADSISearch...
finally
   FreeAndNil(f);
end;
在TMyWaitForm上放置一个动画GIF(自动显示)

在我的网页创建程序中,我在创建网站时有一个进度表,这很有魅力

<>你甚至可以考虑在等待表单上显示一些状态信息(如果TADISISHARCH组件/软件有一个回调函数或事件可以被指派)。
显示一个正在运行的时钟,显示进程所花费的时间,这也是一个不错的选择。

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

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

您的searcher线程代码如下所示:

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;
主线程的代码如下所示:

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;

也许你可以试试这个:

用于Delphi的线程飞溅屏幕

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

你能在你的线程上发布你正在使用的代码吗?线程似乎不太可能在TADSISearch结束之前结束,只有组件在自己的线程中工作时才会发生这种情况,但情况似乎并非如此。正如Jorge所说,我们需要查看您的代码,我猜您并不是在线程中真正运行active directory搜索(您是否将freeonterminate设置为true?)或者尝试从线程直接(不同步)访问mainform。在看到您的代码之前,我们不能再多说了。请等待周一,谢谢大家的关注。我发现,当我在线程中使用ADSISearch时,会出现错误:无法绑定LDAP://xxx。在外面,它运行得很好。他不能。由于TADSISearch正在主线程中执行搜索,因此主消息循环没有处理消息,因此gif不会更新(也不会更新任何其他类型的用户界面)。我还尝试在正在进行同步的线程中使用TADSISearch组件来更新动画gif的表单(Form2),如:TMyThread.Execute;var ADSISearch:TADSISearch;开始搜索内容。。。同步(双更新);结束;TMyThread.doUpdate;开始表格2.更新;结束;我不知道,我已经在问了。也许是因为TADSISearch组件不是线程安全的;“{在此处添加搜索代码}”。当然,我没有使用您在帖子中提到的TADSISearch组件,我也不知道它到底是如何工作的。