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

  • 主题发起人 YuanGuo2001
  • 开始时间
在线程创建的时候就动态建立窗口和窗口上的cancer按钮
窗口和按钮都可以在线程的create中建立(我以前做过,好像是可以的)
fform:tform;
……
fform:=tform.create(nil);
 
不要在线程中创建VCL窗口,即使飞要创建,就在保护方法你创建窗口,
要真正的创建,就用API写,
 
我以前也是在execute中创建的,可是一运行就出错,在create中创建确好好的,奇怪吧
 
----------广告----------(不便之处敬请谅解)
网站:www.wlsd.net
最低价套餐:(只对DELPHI大富翁)
国际域名 1个 --70元
asp空间 100M --220元
集团信箱 5个 60M --赠送
如果还有比我更便宜的,那我不干了!因为我现在不挣钱了!
收到广告请不要生气。呵呵。为了生计没有办法呀!
 
我也有类似问题,帮你UP一下
 
张无忌:你说的对啊,在线程中创建窗口不是个好的方法。
对于我的问题,有什么解决的办法吗?还望指教,谢谢!
 
可以在主线程中创建这个窗口和按钮
用tform.Create(application)
如果要启动多个线程的话,可以压到tlist里来进行管理
 
在线程的保护方法里创建窗体...其实也就是在主线程里创建窗体,
原因是窗体的构造函数里有一个判断当前线程ID以及以及其他条件
如果是在线程里创建窗体,导致消息队列的同步问题,所以建议你
如果一定要在线程里创建窗体就把创建函数用Synchronize()保护
起来,
 
张无忌 :我的代码里只有一个搜索线程,没有其他的
你的意思是在protected 定义过程(创建窗口)
然后在线程的execute里面执行?(同步吗?)
谢谢!
------------>>>
在线程的保护方法里创建窗体...其实也就是在主线程里创建窗体,
原因是窗体的构造函数里有一个判断当前线程ID以及以及其他条件
如果是在线程里创建窗体,导致消息队列的同步问题,所以建议你
如果一定要在线程里创建窗体就把创建函数用Synchronize()保护
起来,
 
谁写过类似的代码,可否给我参考一下?
 
专为你写的代码,供参考:
//搜索单元;
unit U_FrmSearch;
interface
uses
Windows, Messages, Classes, Forms, Controls, StdCtrls;
type
TSearchThread = class;
TFrmSearch = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FSearchThread: TSearchThread;
proceduredo
OnSearchTerminate(Sender: TObject);
end;

TSearchThread = class(TThread)
private
FDelay: Integer;
FSearchFrm: TFrmSearch;
FMainHandle: THandle;
protected
procedure CreateAForm;
procedure Execute;
override;
public
constructor Create(CreateSuspended: Boolean;
AHandle: THandle);
end;

const
//自定义消息常量;
MsgOnSearch = WM_USER + 1;
implementation
{$R *.DFM}
procedure TFrmSearch.Button1Click(Sender: TObject);
begin
if not Assigned(FSearchThread) then
Exit;
if FSearchThread.Suspended then
FSearchThread.Resume
else
FSearchThread.Suspend;
end;

procedure TFrmSearch.DoOnSearchTerminate(Sender: TObject);
begin
if Assigned(FSearchThread) then
FSearchThread.OnTerminate := nil;
Close;
end;

{ TSearchThread }
constructor TSearchThread.Create(CreateSuspended: Boolean;
AHandle: THandle);
begin
inherited Create(CreateSuspended);
FMainHandle := AHandle;
FreeOnTerminate := True;
FSearchFrm := nil;
end;

procedure TSearchThread.CreateAForm;
begin
//创建搜索窗体;
if not Assigned(FSearchFrm) then
begin
FSearchFrm := TFrmSearch.Create(nil);
FSearchFrm.FSearchThread := Self;
//线程终止时释放搜索窗体;
OnTerminate := FSearchFrm.DoOnSearchTerminate;
FSearchFrm.Show;
end;
end;

procedure TSearchThread.Execute;
begin
FDelay := 0;
while not Terminateddo
begin
Inc(FDelay);
Sleep(100);
//DoSearch;
if FDelay = 30 then
Synchronize(CreateAForm);
//向创建搜索线程的主线程发消息;
PostMessage(FMainHandle, MsgOnSearch, FDelay, 0);
end;
end;

end.

//主单元;
unit U_main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, U_FrmSearch;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
proceduredo
MsgOnSearch(var Msg: TMessage);
message MsgOnSearch;
public
SearchThread: TSearchThread;//搜索线程
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
//创建搜索线程;
if not Assigned(SearchThread) then
SearchThread := TSearchThread.Create(False, Handle);
end;

procedure TForm1.DoMsgOnSearch(var Msg: TMessage);
begin
//响应搜索线程的消息;
Caption := IntToStr(Msg.WParam);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//终止搜索线程;
if Assigned(SearchThread) then
begin
SearchThread.Terminate;
SearchThread := nil;
end;
end;

procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if not Assigned(SearchThread) then
Exit;
if not SearchThread.Suspended then
SearchThread.Resume;
SearchThread.Terminate;
end;

end.
 
帮我看看这个
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1742799
 
多人接受答案了。
 
顶部