非常奇怪的问题!我主窗口中有一函数TFormMain.CreateForm1(),是用于创建form1窗口的,但在线程中调用FormMain.CreateForm1(),程序就死了

bphantom 2003-09-27 02:11:47
主窗口中的CreateForm1()函数如下:
procedure TFormMain.CreateForm1();
begin
Form1 := TForm1.Create(self);
Form1.ShowModal();
end;
(Form1的FormStyle为fsStayOnTop,主窗口为fsNormal或fsMDIForm,不重要,问题都一样存在)
我在主窗口的一按钮中调用CreateForm1(),很正常创建了Form1;
我在另一窗口(比如Form2)的一按钮中调用FormMain.CreateForm1(),也很正常建了Form1;
但我在线程中调用FormMain.CreateForm1(),程序就死了,我发现死在了Form1 := TForm1.Create(self);这一句,日,怎么回事????????
线程中调用简化为:
procedure TCtrlThread.Execute;
begin
while Terminated=false do
begin
sleep(250);
if FormMain.ReadBit()=1 then//有车->空循环到没车->执行->结束
begin
while FormMain.ReadBit()=1 do
begin
sleep(250)
end;
FormMain.CreateForm1();
end;
end;
end;
我在此线程中调用主窗口的其他函数,如上面的FormMain.ReadBit()都很正常,但ReadBit()没有创建窗口的语句的。
...全文
116 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bphantom 2003-09-27
  • 打赏
  • 举报
回复
该是:Synchronize(FormMain.CreateForm1);
bphantom 2003-09-27
  • 打赏
  • 举报
回复
你们说的都没错,但我是一定要用showModal的,我要它的返回值的,如if mrOk=ShowModal then
其实我的procedure TFormMain.CreateForm1();是一个很长的procedure,不是这么简单的,怪我没说清楚吧。所以TFormMain.CreateForm1()是不能改的。
我看了 idilent(成为星星的同时,露出菜鸟的实质) 和 hch_45(んこん) 的回复,有所启发,终于搞定,谢谢你们,以后还得多多请教。
改为这样就行了:
procedure TCtrlThread.Execute;
begin
while Terminated=false do
begin
sleep(250);
if FormMain.ReadBit()=1 then//有车->空循环到没车->执行->结束
begin
while FormMain.ReadBit()=1 do
begin
sleep(250)
end;
Synchronize(TFormMain.CreateForm1);
end;
end;
end;
lxhong1980 2003-09-27
  • 打赏
  • 举报
回复
学习
XXSingle 2003-09-27
  • 打赏
  • 举报
回复
同意fyje(云中仙)的说法,当用showmodal时,线程会等待showmodal的 窗体关闭后,才能继续执行...........当前线程.....
hch_45 2003-09-27
  • 打赏
  • 举报
回复
procedure TCtrlThread.CreateForm1Theard;
begin
FormMain.CreateForm1();
end;

procedure TCtrlThread.Execute;
begin
while Terminated=false do
begin
sleep(250);
if FormMain.ReadBit()=1 then//有车->空循环到没车->执行->结束
begin
while FormMain.ReadBit()=1 do
begin
sleep(250)
end;
Synchronize(CreateForm1Theard);
end;
end;
end;
试看看
fyje 2003-09-27
  • 打赏
  • 举报
回复
由于你在另一个线程里创建并且使用了showmodal方法,showmodal方法要求你必须先响应这个窗口才能处理其他的事情,当系统执行到这句的时候,系统就等待你关闭form1
建议你使用show,或者在主线程创建form1,就会正常了
procedure TFormMain.CreateForm1();
begin
Form1 := TForm1.Create(self);
Form1.Show();
end;


idilent 2003-09-27
  • 打赏
  • 举报
回复
线程调用vcl的时候需要使用同步,在你建立一个线程的时候,得到的代码里面有提示,是不是因为这个原因?
idilent 2003-09-27
  • 打赏
  • 举报
回复
线程调用vcl的时候需要使用同步,在你建立一个线程的时候,得到的代码里面有提示,是不是因为这个原因?
hch_45 2003-09-27
  • 打赏
  • 举报
回复
prcedure TCtrlThread.CreateForm1Thread;
begin
FormMain.CreateForm1();
end;
procedure TCtrlThread.Execute;
begin
while Terminated=false do
begin
sleep(250);
if FormMain.ReadBit()=1 then//有车->空循环到没车->执行->结束
begin
while FormMain.ReadBit()=1 do
begin
sleep(250)
end;
Synchronize(CreateForm1Thread);
end;
end;
end;

试看看。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧