首页新闻找找看学习计划

.NET中非常奇怪的问题.

0
[已解决问题] 解决于 2008-04-09 13:41
<P>private void button1_Click(object sender, EventArgs e)<BR>{<BR>this.button1.Enabled = false;<BR>Form2 f = new Form2();<BR>Thread.Sleep(3000);<BR>f.Show();<BR>this.button1.Enabled = true;<BR>}<BR>以上为一个按钮的事件,当我点击的时候它会不可用,在不可用的时候,我再点击.事实上它也接受了事件,点击几次它会show几个窗口.也就是说即使是在不可能用的状态下它也会接受事件.不知道为什么?</P> <P>&nbsp;</P>
侯垒的主页 侯垒 | 老鸟四级 | 园豆:3435
提问于:2008-04-03 19:28
< >
分享
最佳答案
0
窗口消息队列... Windows系统为每个UI线程(这里可以暂时简单理解为窗口)提供了一个(可以这么理解)队列,里边排着所有的输入消息.UI线程会不断地从这个队列里取消息,如果队列是空的,线程就会停下来等到下一个消息到达,如果不为空,就处理获取的消息. Thread.Sleep只会暂停你自己的线程,却没有暂停系统负责鼠标事件的线程,所以相应的点击消息就排在队列里,等你的线程醒了以后,于是就获取了以前未处理的消息.
deerchao | 大侠五级 |园豆:8167 | 2008-04-03 21:03
其他回答(3)
0
首先我不明白你为什么这么用,但是作为一个线程的问题,确是个Good question! 废话少说,先解决问题,你按下边的办法修改一下,肯定只出一个窗口,无论点几下。 private void button1_Click(object sender, EventArgs e) { this.button1.Enabled = false; Application.DoEvents(); Form2 f = new Form2(); Thread.Sleep(3000); Application.DoEvents(); f.Show(); this.button1.Enabled = true; } 这涉及到 缺省的窗口消息处理 和 程序主线程,我想你想一想就会明白的,如果需要进一步讨论,我们再论。
杨连国 | 园豆:295 (菜鸟二级) | 2008-04-04 12:33
0
学习了,呵呵
volnet(可以叫我大V) | 园豆:720 (小虾三级) | 2008-04-06 04:16
0
虽然还是不知道你的真正目的,给你个办法让你曲线救国: private void button1_Click(object sender, EventArgs e) { if (this.button1.Enabled) { this.button1.Enabled=false; Form2 f = new Form2(); System.Threading.Thread.Sleep(3000); f.Show(); this.button1.Enabled = true; } }
风海迷沙 | 园豆:4453 (老鸟四级) | 2008-04-07 10:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册