多线程的初学者。以下是我的C#程序中用子线程显示LED屏幕信息的代码片段:thread_LED = new Thread(new ThreadStart(showLEDMsg)); //创建一个线程
thread_LED.Start(); //启动当前线程private void showLEDMsg()
{
  this.Invoke(new delegate_LED(showLED)); //也试过this.BeginInvoke(new delegate_LED(showLED));
}private void showLED()
{
  System.Threading.Thread.Sleep(5000);//延时5秒钟(模拟耗时的工作)
  //showLEDMsg(0, msg, ""); //LED屏显示信息  thread_LED.Abort(); //关闭线程
}最后一个函数是让LED屏幕显示文本信息的,我这里先用一个延时语句代替。原本使用多线程的好处是不让主线程卡,可我运行后发现,主线程仍然会卡,一定要等到子线程5秒钟之后界面的控件(如comboBox等)才好使,问题出在哪儿呢?谢谢!

解决方案 »

  1.   

    附带问一下:
    这里是用this.Invoke(new delegate_LED(showLED))好呢还是用this.BeginInvoke(new delegate_LED(showLED));好呢?
      

  2.   

    Invoke应该去更新界面,还是在UI线程上操作
    你的Sleep不应该再invoke里面,耗时间也不应该耗在在更新界面里面
      

  3.   

    sleep语句是用来模拟耗时的工作的,LED显示大屏幕刷新后重新显示信息总是较慢的,这里先用sleep语句模拟LED屏幕。
      

  4.   

    private void showLEDMsg()
    {
      //放在这里,showLed的去掉。
      System.Threading.Thread.Sleep(5000);//延时5秒钟(模拟耗时的工作)
      
      this.Invoke(new delegate_LED(showLED)); //也试过this.BeginInvoke(new delegate_LED(showLED));
    }
      

  5.   


    private void showLEDMsg()
    {
      thread_LED = new Thread(new ThreadStart(showLEDMsg)); //创建一个线程
      thread_LED.Start(); //启动当前线程
    }private void showLED()
    {
      System.Threading.Thread.Sleep(5000);//延时5秒钟(模拟耗时的工作)
      showLEDMsg(0, msg, ""); //LED屏显示信息
    }
    试试看这个
      

  6.   

    又没有跨线程操作,为什么用Invoke
      

  7.   


    改成以下语句果然不卡了,如:
    thread_LED = new Thread(new ThreadStart(showLEDMsg)); //创建一个线程
    thread_LED.Start(); //启动当前线程private void showLEDMsg()
    {
      System.Threading.Thread.Sleep(5000);//延时5秒
      thread_LED.Abort();   //关闭线程
    }但是如果将延时语句换成以下真正的LED显示大屏的代码还是照卡不误,Why?
    private void showLEDMsg()
    {
      StringBuilder sb = new StringBuilder("                       ");
      string msg = "xxxxxxx管理系统." + sb;
      string msg1 = "正在处理中";
      showLEDMsg(0, msg, msg1, ""); 
      thread_LED.Abort();   //关闭线程
    }
      

  8.   

    对led的操作无非是调用led厂家的一些动态库,不会对主程序有什么影响吧