关于EnableWindow使用,可能产生的问题疑惑

leverkusen188 2008-12-05 02:43:53
最近做的一个简单的应用程序,窗口A上点击一个button,需要打开另一个窗口B,当前窗口A在2秒后自行关闭。
被打开的窗口B也是具有该特性,也就是点击它上面的button,又打开另一个窗口C,窗口B在2秒后自行关闭。

为了防止跳转异常,在每个窗口上的button响应处理函数中,先调用EnableWindow(false),禁止掉其他操作,然后进行跳转。
但有时会出现这样的情况,点击了一个button后,处理函数会被调用两次,也就是打开了两个窗口。根据记录日志来看,这两次处理函数调用间隔时间,有时候会达到近1秒之多。
我不明白,难道第一次处理函数中的 EnableWindow(false),没有起到作用么?
诚心请教!
...全文
935 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
饶鹏 2008-12-08
  • 打赏
  • 举报
回复
我也遇到过这个问题,原因和15,16楼说的一样。
我是用多线程来解决这个问题的。
wmpkumse 2008-12-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fishion 的回复:]
你settimer之后有没有killtimer了
[/Quote]

正解
zhuweiping2003 2008-12-08
  • 打赏
  • 举报
回复
建议不要sleep
zhuweiping2003 2008-12-08
  • 打赏
  • 举报
回复
SetTimer()
KillTimer()


leverkusen188 2008-12-08
  • 打赏
  • 举报
回复
楼上回的优点道理,我先去查查看。
另提的两秒窗口关闭,用的是Timer,不过在重载的DestroyWindow函数中,有Sleep等待所有线程关闭的while循环,不知道这个是不是原因。

查到问题一定结贴给分。谢谢各位了
guogangj 2008-12-05
  • 打赏
  • 举报
回复
再根据你的描述“根据记录日志来看,这两次处理函数调用间隔时间,有时候会达到近1秒之多。”
我没看你的代码,但我感觉很可能你是用一个死循环之类的来达到这两秒钟的延时,效果也是能使得窗口线程没办法deque,在处理完这个“繁重”的任务之前。
guogangj 2008-12-05
  • 打赏
  • 举报
回复
"窗口A上点击一个button,需要打开另一个窗口B,当前窗口A在2秒后自行关闭"

这不是bug。

我在想这两秒钟你是怎么个等法,Sleep,还是设置timer?如果用Sleep,会有问题,如果用timer,就没问题。

因为:如果是Sleep,窗口的线程会被block掉,你对窗口已经disable掉的button继续点击的鼠标消息会进入消息queue,但由于这时候窗口的线程是被死的,这个消息就没有被dequeue,当Sleep时间结束后,窗口线程重新在队列里dequeue(Get message),就会得到这个鼠标点击消息,再处理一遍……
ltttklyzy 2008-12-05
  • 打赏
  • 举报
回复
看不见代码..没得说...
ilovedrv 2008-12-05
  • 打赏
  • 举报
回复
自锁是安全的方式,既然不能控制消息的流程,为什么不限定一下呢
scq2099yt 2008-12-05
  • 打赏
  • 举报
回复
定义一个标志变量,初始化为FALSE,在按钮的点击事件中,先判断该变量,如果为TRUE则直接返回,否则将其设置为TRUE,然后再执行打开另一窗口的代码。
yuke629 2008-12-05
  • 打赏
  • 举报
回复
资源ID可能有重复。使事件乱响映
leverkusen188 2008-12-05
  • 打赏
  • 举报
回复
如楼上这样等于是小锁一把了,能解决这一问题。
但只是想了解该问题产生的原因,难不成是MFC开发的应用程序必备bug?
casale 2008-12-05
  • 打赏
  • 举报
回复
应该不是EnableWindow函数的问题,建议楼主贴代码上来
fishion 2008-12-05
  • 打赏
  • 举报
回复
你settimer之后有没有killtimer了
cnzdgs 2008-12-05
  • 打赏
  • 举报
回复
定义一个标志变量,初始化为FALSE,在按钮的点击事件中,先判断该变量,如果为TRUE则直接返回,否则将其设置为TRUE,然后再执行打开另一窗口的代码。
哈了 2008-12-05
  • 打赏
  • 举报
回复




您只能输入 8000 个字符禁用UBB 内容存入剪贴板

回帖是一种美德!传说每天回帖即可获得 10 分
aa3000 2008-12-05
  • 打赏
  • 举报
回复
不用 enablewindow 的时候,处理函数会被调用两次吗?
leverkusen188 2008-12-05
  • 打赏
  • 举报
回复
处理函数中,一开始就EnableWindow(false)就是为了防止按钮响应多次,打开多个窗口。
如楼上所说的话,就失去它存在的意义了。
孤客天涯 2008-12-05
  • 打赏
  • 举报
回复
把顺序反一下试试,先打开其它窗口然后EnableWindow(false)本窗口
leverkusen188 2008-12-05
  • 打赏
  • 举报
回复
回楼上的,只有收到该按钮click消息才会调用,未有在其他处手动调用之。
加载更多回复(1)

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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