2010-01-16 94 views
4

也许,这对你来说很容易,但我很努力地工作几天,用TADSISearch组件查询adsi的项目(用于教育目的)。我试图在Form2上显示一个'Working,Please wait ..'启动画面,同时TADSISearch正在搜索活动目录。虽然我根据我尝试了各种可能性,但我无法成功。我尝试在一个线程中使用TADSISearch,但是在ADSIsearch完成之前线程正在终止。我认为TADSISearch不是线程安全的。你怎么看?此外,另一种方式,我创建Form2并使用线程来更新它,但动画GIF正在停止,而主要形式去了adsi搜索。你能说些什么呢?如何在ADSISearch正在运行时让请等待屏幕,并让主窗体响应。 Application.ProcessMessages或者定时器也不是。非常感谢阅读和答案。'正在工作,请等待'屏幕线程?

+2

您可以发布您在线程中使用的代码吗?在TADSISearch结束之前,线程似乎不太可能结束,只有组件在自己的线程中工作时才会发生,似乎并非如此。 – 2010-01-16 17:39:35

+0

由于Jorge说我们需要查看你的代码,我猜测你并没有真的在线程中运行活动目录搜索(你有freeonterminate设置为true吗?)还是试图直接访问mainform(没有同步)线程。在我们看到您的代码之前无法多说。 – Remko 2010-01-16 21:22:35

+0

请等待星期一,谢谢大家的关注.. – Knn 2010-01-16 22:57:55

回答

9

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

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

在哪里可以使用ADSISearch? – Knn 2010-01-17 18:15:10

+0

您可以在我提到的Execute方法中添加您的ADSISearch代码; “{在此添加您的搜索代码}”。当然,我还没有使用你在帖子中提到的TADSISearch组件,我不知道它是如何工作的。 – vcldeveloper 2010-01-17 23:15:24

+0

对不起,没有看到 – Knn 2010-01-18 08:33:56

1

线程在搜索结束前如何终止?如果在线程中执行搜索,并且只有一个线程实例应该工作。

+0

我不知道,我已经问过了。也许,因为TADSISearch组件不是线程安全的。 – Knn 2010-01-16 22:51:20

-1

难道你们就不能只是做一个

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

在TMyWaitForm(这本身显示)把GIF动画?

在我的网站创建程序中构建网站时,我有一个进度表单,并且这种工作方式就像一种魅力。

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

显示运行时钟显示过程正在进行的时间量也是一个很好的接触。

+1

他不能。当TADSISearch在主线程中执行搜索时,主消息循环不处理消息,因此gif不会更新(也不会更新任何其他类型的用户界面)。 – 2010-01-16 17:41:00

+0

我也尝试在一个线程中使用TADSISearch组件进行同步更新动画gif的窗体(Form2)为: TMyThread.Execute; var ADSISearch:TADSISearch; begin ADSISearch stuff ... Synchronize(doUpdate); 结束; TMyThread.doUpdate; begin Form2.Update; 结束; – Knn 2010-01-16 22:56:27

3

也许你可以试试这个:

螺纹德尔福的飞溅屏幕
http://cc.embarcadero.com/Item/20139

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