两个线程,一个关闭窗口,一个打开窗口,怎样才能不出错啊!

RJU 2001-07-24 03:02:50
两个线程如下,在程序中需同时开着这两个线程:
1)
procedure Thrd1.Execute;
begin
While True do
begin
if Terminated then Exit;
if Not isCloseingForm then //判断是否正在关窗口
begin
isShowingForm:=True;//修改正在显示窗口的标志
Form3.show; //显示窗口
Form3.Refresh;
isShowingForm:=False;//修改正在显示窗口的标志
end;
end;
end;

2)procedure Thrd2.Execute;
begin
While True do
begin
if Terminated then Exit;
if Not isShowingForm then//判断是否正在显示窗口
begin
isCloseingForm:=True;;//修改正在关闭窗口的标志
Form3.Close;//关闭窗口
isCloseingForm:=False;//修改正在关闭窗口的标志

end;
end;
end;

其中,form3在程序中自动生成
但每次程序运行一会就提示如下出错:can not change visible in onshow or onhide
分数不多,请问如何解决这个问题啊!?
...全文
180 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hieefxz 2001-08-01
  • 打赏
  • 举报
回复
可以啊,用synchronize是不行,因为它不是安全机制,它只是让子线程中的方法转到主线程中执行而已!
例子:

。。。。
var
Hmutex:Thandle;
。。。。
Tform1.formcreate(sender:object);
begin
。。。
createmutex(handle,false,null);
。。。
end;
。。。。。。
thread1.execute;
begin
。。。。。
WaitForSingleObject(HMutex,1);

isShowingForm:=True;// 共享的资源代码;
releasemutex(hmutex);
end;

thread2.execute;
begin
。。。。。
WaitForSingleObject(HMutex,1);//加琐

isShowingForm:=True;// 共享的资源代码;
releasemutex(hmutex);//解琐
end;

有问题发信到hieefxz@163。net
RJU 2001-07-25
  • 打赏
  • 举报
回复
up
RJU 2001-07-24
  • 打赏
  • 举报
回复
提前
RJU 2001-07-24
  • 打赏
  • 举报
回复
hieefxz(凡人邪真) :采用Synchronize也是不行的,不考虑主程序几乎不能操作的问题同样不形

xieha(研志) :能具体一点吗?
煜知搬砖者 2001-07-24
  • 打赏
  • 举报
回复
学过操作系统原理没有?新建一个信号量,也就是标志变量了
hieefxz 2001-07-24
  • 打赏
  • 举报
回复
isshowform 是一个共享资源,不具备线程安全,所以线程1和2要采用安全访问机制。
RJU 2001-07-24
  • 打赏
  • 举报
回复
alwssoan(巧克力):
设公共变量不行,
出现的问题好像是这样:
当form3.Close需要一点时间,在没有完全执行完CLOSE的时候,执行Form2.Show就出错
我在onClose中设变量没用,因为错误实在onClose事件之后
能帮我试一下吗?只有这些分了
RJU 2001-07-24
  • 打赏
  • 举报
回复
alwssoan(巧克力):
设公共变量不行,
出现的问题好像是这样:
当form3.Close需要一点时间,在没有完全执行完CLOSE的时候,执行Form2.Show就出错
我在onClose中设变量没用,因为错误实在onClose事件之后
能帮我试一下吗?只有这些分了
alwssoan 2001-07-24
  • 打赏
  • 举报
回复
那你设个公共变量嘛,第一个执行执行后改变值,第二个执行后也改变值,至于可不可执行就根据公共变量来判定,跟访问临界资源一样嘛
RJU 2001-07-24
  • 打赏
  • 举报
回复
glcs(古老传说):
这种方法让我很担心,在退出程序时容易出现出错提示
还有没有其他办法?
glcs 2001-07-24
  • 打赏
  • 举报
回复

try{}
把你的代码括起来,然后在
catch(){}里面什么也不写
试试
RJU 2001-07-24
  • 打赏
  • 举报
回复
没人懂吗?

5,388

社区成员

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

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