如何在一个线程中 呼出窗体(100)

F

fishhao

Unregistered / Unconfirmed
GUEST, unregistred user!
我用以下代码实现:procedure open;
begin
Form2:=TForm2.Create(nil);
Form2.ShowModal;
Form2.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateThread(nil,0,@open,nil,0,ThreadID);
end;
发现。有时候正常。但时候呼出的窗体空白,就是没任何控件。是随机发生的。不知道什么问题,
 
不是那么严重吧。。只是很简单的例子。。没理由那么久也没人发现吧
 
我这几天线程也碰到这样的问题.在创建窗口时,程序直接无反应了.不知道是假死还是里面有代码死循环了.弄得我没办法做.
 
用这个语句试试Tryfinallyend;
 
procedure openI;
begin
Form2:=TForm2.Create(nil);
Form2.ShowModal;
Form2.Free;
end;
procedure openI;
begin
syn(open);// syn同步,后面的字母忘记了,呵呵!end;
 
Synchronize好像是TThread 的方法。。如果 SDK 怎么用它。。?LS 那样不行呢
 
procedure open;
begin
Form2:=TForm2.Create(nil);
Form2.ShowModal;
Form2.Free;
end;
procedure open()begin
postmessage(handle, WM_SHOWFORM2, 0, 0);
end;
在主窗体中 procedure Tform1.Showform2(var msg : TMessage)begin
Form2:=TForm2.Create(nil);
Form2.ShowModal;
Form2.Free;
end;
 
用消息可以解决问题,用Synchronize 也可以。我最后想知道没有 TThread 的时候。。API 多线程。。是怎么用 Synchronize的?
 
看看 Synchronize 函数!~现成的代码不看,哎~
 
如果要在线程中创建并解决那个VCL的BUG你试试这样var ev:Boolean;procedure open;
begin
Form2:=TForm2.Create(application);
ev:=true;
Form2.ShowModal;
Form2.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);var TID:cardinal;
begin
ev:=false;
CreateThread(nil,0,@open,nil,0,TID);
while not evdo
Sleep(0);
end;
没有处理其释放报错问题.如需处理,额外加入几行代码即可.
 
顶部