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