也许,这对你来说很容易,但我很努力地工作几天,用TADSISearch组件查询adsi的项目(用于教育目的)。我试图在Form2上显示一个'Working,Please wait ..'启动画面,同时TADSISearch正在搜索活动目录。虽然我根据我尝试了各种可能性,但我无法成功。我尝试在一个线程中使用TADSISearch,但是在ADSIsearch完成之前线程正在终止。我认为TADSISearch不是线程安全的。你怎么看?此外,另一种方式,我创建Form2并使用线程来更新它,但动画GIF正在停止,而主要形式去了adsi搜索。你能说些什么呢?如何在ADSISearch正在运行时让请等待屏幕,并让主窗体响应。 Application.ProcessMessages或者定时器也不是。非常感谢阅读和答案。'正在工作,请等待'屏幕线程?
回答
图形用户界面应由主线程更新。您应该将搜索代码放入一个单独的线程中,并且在搜索器线程正在工作时,主线程可以显示动画以及“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;
在哪里可以使用ADSISearch? – Knn 2010-01-17 18:15:10
您可以在我提到的Execute方法中添加您的ADSISearch代码; “{在此添加您的搜索代码}”。当然,我还没有使用你在帖子中提到的TADSISearch组件,我不知道它是如何工作的。 – vcldeveloper 2010-01-17 23:15:24
对不起,没有看到 – Knn 2010-01-18 08:33:56
线程在搜索结束前如何终止?如果在线程中执行搜索,并且只有一个线程实例应该工作。
我不知道,我已经问过了。也许,因为TADSISearch组件不是线程安全的。 – Knn 2010-01-16 22:51:20
难道你们就不能只是做一个
f := TMyWaitForm.Create(self);
try
f.Show();
...start the TADSISearch...
finally
FreeAndNil(f);
end;
在TMyWaitForm(这本身显示)把GIF动画?
在我的网站创建程序中构建网站时,我有一个进度表单,并且这种工作方式就像一种魅力。
您甚至可以考虑在等待表单上显示一些状态信息(如果TADSISearch组件/软件具有回拨功能或可分配的事件)。
显示运行时钟显示过程正在进行的时间量也是一个很好的接触。
他不能。当TADSISearch在主线程中执行搜索时,主消息循环不处理消息,因此gif不会更新(也不会更新任何其他类型的用户界面)。 – 2010-01-16 17:41:00
我也尝试在一个线程中使用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
也许你可以试试这个:
螺纹德尔福的飞溅屏幕
http://cc.embarcadero.com/Item/20139
我在触摸屏/终端应用程序(瘦客户端,Wifi,RemObjects等)上使用它,它很好用! 还有一个GIF动画工作。
- 1. 请等待在asp.net中的屏幕
- 2. BlackBerry请等待屏幕超时
- 3. 在MVC等待屏幕4
- 4. 线程和正在等待
- 5. Android线程正在等待
- 6. 线程正在等待ThreadPoolExecutor
- 7. 等待屏幕,等待响应
- 8. 请等待后台线程?
- 9. sh屏幕 - 等待屏幕终止
- 10. Java swing工作线程等待EDT
- 11. 等待所有工作线程结束
- 12. 等待屏幕旋转
- 13. 黑莓 - 等待屏幕
- 14. 显示等待屏幕WindowsPhone8
- 15. iOS线程等待操作
- 16. 等待工作不等待
- 17. 在WPF中显示“等待”屏幕
- 18. 并发线程正在等待任务
- 19. 线程正在等待异步回调
- 20. XmlPullParser同步:线程正在等待
- 21. 等待线程
- 22. UI线程等待其他线程执行 - 不能正常工作
- 23. 多线程 - 等待线程
- 24. Rails的:“等待” HTML屏幕,而PDF正在生成
- 25. 线程在C“等待父”
- 26. 在Android中线程等待
- 27. 等待的线程
- 28. 让线程等待
- 29. 删除,请等待弹出屏幕上的返回键
- 30. AJAX - 定时mySQL查询(请等待屏幕)
您可以发布您在线程中使用的代码吗?在TADSISearch结束之前,线程似乎不太可能结束,只有组件在自己的线程中工作时才会发生,似乎并非如此。 – 2010-01-16 17:39:35
由于Jorge说我们需要查看你的代码,我猜测你并没有真的在线程中运行活动目录搜索(你有freeonterminate设置为true吗?)还是试图直接访问mainform(没有同步)线程。在我们看到您的代码之前无法多说。 – Remko 2010-01-16 21:22:35
请等待星期一,谢谢大家的关注.. – Knn 2010-01-16 22:57:55