我现在有一个窗口,这个窗口内的数据在不断的刷新,刷新的速度是1ms一次(很快);  然后我在这个窗口上放了2个按钮; 
  
我的问题来了,当我把窗口打开,让这个窗口开始1ms刷新一次数据的时候,我发现窗口上的其他控件全都“无效了”,只要点击二个按钮中的任意一个,窗口就会死掉(未响应),本来刷新的数据也不刷新了,窗口“死掉”了;但是如果不点这些按钮,窗口就一直可以正常刷新(没死掉);请问这是为什么? 是窗口的重画太快了,导致其他控件无法使用吗?

解决方案 »

  1.   

    刷新太快,获取数据太慢,放到异步执行,timer是会阻塞主线程的
      

  2.   

    不好意思 我说的不够全面,这些1ms刷新的数据就是DSP给我的;DSP以1ms的周期给我数据,我就以1ms的速度来画出来在这种情况下,1ms的画画刷新窗口下, 其他控件都好像“死掉了”;而且我又发现,我用zedgraph来讲这些数据画出来,如果DSP以100ms的速度给我数据,我再以100ms的速度来画的话,没有问题;但是如果DSP以1ms的速度给我数据,我再以1ms的速度来画的话,zedgraph在画了将近10000个点的时候就会“死掉”,其他啥都没干,程序自动死掉了;我是在一个线程里面做的,1ms收完后,1ms画出来(只有1条曲线)请问这是为什么?
      

  3.   

    敢问怎么才能分线程去做呢?我知道现在的方法(单线程接收,然后处理)肯定是不行了,那么怎么才能分线程去做呢?能否说的详细一点?小弟我新手啊备注:项目中用到的通讯时CANOpen,故能达到1ms一个点;  如果用到了USB,那么会更快,一秒钟16K的点
      

  4.   

    多线程示例: Thread th = new Thread((ThreadStart)delegate()
                {
                    test();
                });
                th.Start();
     public void test()
            {
                int i=0;
                while (i<100000)
                {
                    this.Invoke
                        (
                        (MethodInvoker)delegate()
                        {
                            label1.Text = i.ToString();
                        }
                        );
                    i += 100;
                }
            }
      

  5.   

    timer会阻塞主线程?我第一次听说!你将button事件里面的代码提取成方法,然后用线程去执行!保证你的没有问题,如果你button事件里面的代码也会刷新界面的话,就用委托去刷新界面!
      

  6.   

    窗体的timer组件是单线程,是UI线程执行方法体的,肯定会阻塞
      

  7.   

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            int number = 0;        private void Form1_Load(object sender, EventArgs e)
            {
                timer1.Enabled = true;
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                button1.Text = "按钮" + number; 
                number++;
            }        private void button2_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(delegate()
                {
                    NewMethod();
                });
                th.Start();
                
            }        private static void NewMethod()
            {
                for (int i = 0; i < 10000; i++)
                {
                    Console.WriteLine(i);
                }
            }        private void button1_Click(object sender, EventArgs e)
            {
                timer1.Enabled = false;
            }
        }
      

  8.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Timers;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {        int number = 0;
            private System.Timers.Timer timer = new System.Timers.Timer(1);        public Form1()
            {
                InitializeComponent();
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                timer.Enabled = true;
            }        void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                this.Invoke((EventHandler)delegate
                    {
                        button1.Text = "按钮" + number;
                    });
                number++;
                Thread.Sleep(1000);
            }        private void button2_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(delegate()
                {
                    NewMethod();
                });
                th.Start();        }        private static void NewMethod()
            {
                for (int i = 0; i < 10000; i++)
                {
                    Console.WriteLine(i);
                }
            }    }
    }创建一个窗体,拖2个button上去。button2分别注册对应的button2_Click(object sender, EventArgs e)事件!运行后点击button1看看。timer每1毫秒更新数据的同事阻塞线程1000毫秒,点击button2看看,会不会假死!~
      

  9.   

    嗯 Java_Script__给的代码我差不多能够看懂我回去试试先感谢大家的热心回复