线程中创建一个TForm对象的问题!!!(100分)

  • 主题发起人 YuanGuo2001
  • 开始时间
Y

YuanGuo2001

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是这样的,我在主程序中创建一个线程,这个线程实现搜索文件的功能,
为了让用户能Termanited该线程,我在主程序中(注意:不是在线程中)
同时创建一个Modeless的Form,这个Form上的Cancer按钮可以Terminate线程。(实现的代码如下)
现在的问题是:
我不知道如何实现[blue]定时[/blue]出现Form窗口(譬如线程执行1秒或者已经搜索了1000个文件的时候)。
解决思路如下
1.用两个线程实现: SearchThread(搜索线程)和Form创建线程,这个涉及到很多问题,譬如同步等。
2.用一个线程,即SearchThread(搜索线程)(即我的实现方法:代码见下面)
但是线程执行的时间很难判断,而且知道了也不能把消息发送给主窗口???
还望不吝赐教,谢谢!
//*******************代码*******************:
Public SearchThread: TSearchThread;//搜索线程
begin
SearchThread := TSearchThread.Create(32,Recures,Dir,Filter);
//同时创建窗口
//if 线程执行了1秒 //窗口创建条件?????这里怎么实现啊??
try
if not Assigned(SearchForm) then
SearchForm := TSearchForm.Create(Application);
SearchForm.show;
except
end;
//edn try
end;

 
有兴趣顺便看看这个问题:
http://delphibbs.com/delphibbs/dispq.asp?lid=1685529
 
为什么非要等线程执行一段时间后才创建窗口?开始的时候就创建不行吗?
 
还有,你把创建窗口的代码放到线程的execute里面不行吗?
 
关注,帮你up
 
seraph_q :这个线程实现搜索文件的功能,譬如要搜索的目录文件不多
的时候,不到一秒的时间就可以完成搜索,所以就没有必要创建窗口。
----》》
你把创建窗口的代码放到线程的execute里面
好像不行,会出现异常错误,SearchForm := TSearchForm.Create(Application)改成
SearchForm := TSearchForm.Create(nil)也不行
你知道怎么实现吗?
 
关注,帮你up
 
都没有人知道吗??
 
判断时间可以用GetTickCount()函数,
线程与主线程同步可以调用线程的Synchronize()方法。
 
参看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1575401
中 beta 的回答(指发消息)。
另外,http://www.delphibbs.com/delphibbs/dispq.asp?lid=1076676 中 barton 的
回答提供了一些线程方面的答案。
 
那么就创建一个普通的对话框。在Execute函数里面的循环里用GetTickCount得到Windows从
启动以来到目前为止经过的毫秒数。减去Execute开始时用GetTickCount得到的这个毫秒数,
就可以得知线程运行了多久。然后SearchForm.Show就好了。不过这种情况下想要ShowModal
就不行了。
 
skyweb:这几个函数我知道,可否就我的问题讲讲解决思路,谢谢!
小雨哥:看了您推荐的帖子,还是不太明白,可否帮忙看看,譬如
barton:SetEvent(GlobalEvent);
//(线程捕获到事件终止)
不知道这个事件与我的问题(线程执行的时间很难判断)怎么联系起来?要用回调函数吗?
我看了这两个帖子,看来你也对这个比较内行,可否就我这个具体问题写点代码给我参考,
谢谢您了!!
seraph_q :在线程Execute里面 创建非模式窗口.Show会出现异常错误的,不知道为什么?
 
不会吧,我刚刚试了,可以的阿
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyThread = class(TThread)
public
procedure Execute;override;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TMyThread.Execute;
begin
FreeOnTerminate:=True;
Form2.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
var t:TMyThread;
begin
t:=TMyThread.Create(false);
end;

end.
 
seraph_q:这样也可以??
Form2.Show??
 
为什么不可以?Form2位于unit2里,我uses unit2了,当然可以。
Form2是自动创建的。
你是不是吧form2.show放到循环里面去啦?
 
Form2是自动创建的??
除了主窗口,其他Form我都没有自动创建。
我不太提倡窗口自动创建,回头我试一下。
 
有没有高手指点啊??
 
可以向主窗口或Application.Handle发自定义消息,第一次要求创
建和显示SearchForm,第二次要求关闭和Destroy之。第一次发消息
由循环次数和时间为条件控制是否发出,第二次是在循环结束后发出。
如果你的SearchThread要经常创建,SearchForm还是先创建的好,
至于什么时候显示什么时候隐藏则由代码控制。
 
怎么实现?
 
顶部