首页 新闻 会员 周边 捐助

winform诡异的问题!!!!!!!!!

0
[待解决问题]

1.加了Application.DoEvents();这句。效果是第一幅图,,不加的时候效果是第二幅图!!!大神们请问是什么情况呀!!

2.Application.DoEvents();msdn解释 是处理当前在消息队列中的所有 Windows 消息

  那怎样在调试的时候查看消息队列中包含了哪些windows消息??

  public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form3_Load);
        }

        void Form3_Load(object sender, EventArgs e)
        {
            Thread tr = new Thread(new ThreadStart(DO));
            tr.Start();
        }

        private void DO()
        {
            this.Invoke(new Action(() =>
            {
                this.textBox1.Text = "C#";
                Application.DoEvents();
                Thread.Sleep(3000);
            }));
        }
    }

 

彬彬@科比的主页 彬彬@科比 | 初学一级 | 园豆:43
提问于:2013-03-24 00:17
< >
分享
所有回答(4)
0

windows应该有个消息队列的吧

chenping2008 | 园豆:9836 (大侠五级) | 2013-03-24 09:46

怎样解释这种情况呢??能否告知??谢了

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2013-03-24 12:45
0

触发消息队列中排队的消息。

参考:http://q.cnblogs.com/q/47023/

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-24 13:12

上面这种情况你能解释是什么原因嘛???

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2013-03-24 13:59

@彬彬@科比: 为什么有一个窗体会出现加载不出控件呢。因为load事件里面调用了一个线程,而这个线程中调用了this.Invoke()。这个方法将Thread.Sleep(3000)停顿的效果发给的主窗体form的线程,导致form线程暂停。所以load事件会停3秒,然后再开始加载.

但如果你修改do方法为如下,就不会等待3秒

 private void DO()
        {
            this.Invoke(new Action(() =>
            {
                this.textBox1.Text = "C#";
            }));

                Application.DoEvents();
                Thread.Sleep(3000);
        }

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-24 14:35

@滴答的雨: 可能我说的不是很清楚。。两个都线程停顿了三秒的。。我是想问为什么 去掉了Application.DoEvents();连控件都出不来了???

支持(0) 反对(0) 彬彬@科比 | 园豆:43 (初学一级) | 2013-03-24 15:09

@彬彬@科比:

1、我想说的等待3秒是说要不要等待3秒再加载控件。

2、我上面想回答的效果是这样的:

     a、主线程执行load方法。

     b、辅助线程开始执行Invoke,但是Invoke会将消息转给主线程由主线程执行。

     c、此时主线程消息队列有两个事情,加载控件,设置控件的Text值再Sleep(3000)

     d、DoEvents()就是告诉在Sleep(3000)之前,先看看有没有别的消息还没执行完,这里就是加载控件,先执行完加载再Sleep(3000).没有DoEVent()即执行完Sleep(3000)后再继续执行加载控件,所以现在控件会等待3秒再呈现出来

支持(2) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-24 20:56
0

1、我想说的等待3秒是说要不要等待3秒再加载控件。

2、我上面想回答的效果是这样的:

     a、主线程执行load方法。

     b、辅助线程开始执行Invoke,但是Invoke会将消息转给主线程由主线程执行。

     c、此时主线程消息队列有两个事情,加载控件,设置控件的Text值再Sleep(3000)加盟网www.30jm.com加盟网

     d、DoEvents()就是告诉在Sleep(3000)之前,先看看有没有别的消息还没执行完,这里就是加载控件,先执行完加载再Sleep(3000).没有DoEVent()即执行完Sleep(3000)后再继续执行加载控件,所以现在控件会等待3秒再呈现出来

xingxingsongjing | 园豆:208 (菜鸟二级) | 2014-03-05 10:37
0

你可以试试:

BeginInvoke(new MethodInvoker(delegate
                            {
                                this.textBox1.Text = "C#";
                            }));

KingsWang | 园豆:213 (菜鸟二级) | 2015-05-08 17:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册