感觉好像点击Check1Button后没有启线程呢,要是启线程的话不会卡主UI线程的

解决方案 »

  1.   

    代码如下:
      /// <summary>
      /// 定义一个队列,用于记录用户创建的线程
      /// 以便在窗体关闭的时候关闭所有用于创建的线程
      /// </summary>
      private List<Thread> ChaosThreadList;
      /// <summary>
      /// 窗体的初始化函数,初始化线程队列ChaosThreadList
      /// </summary>
      public Form1()
      {
         InitializeComponent();
         ChaosThreadList = new List<Thread>();
      }
      static bool IsOk = false;
      static int arrIndex = 0;
      static string SpiNum = "";
      static ushort maxLen;
      static string tempStr = "Usable flash size: ";
      static string tempStr2 = "Recongnized AMD-compatible device on BC5-MM (elv), ";
      //这个类是我check硬件flash的信息的,初始化在这里
      Class_Csr csr = new Class_Csr(out maxLen);
      bool click;
      private volatile int result1= 1;
      private volatile int result2 = 1;
      private volatile int result3 = 1;
      private volatile int result4 = 1;
     
     /// <summary>
     /// 定义一个代理
     /// </summary>
     private delegate void myDelegate3();
     /// <summary>
     /// 定义一个函数,专门chck FLASH info;
     /// </summary>
     private void Delegate_3_Run()
     {            
        if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内
        {
            if (result3 == Class_Csr.TFL_OK)
            {
                label1.Text = "Verify Passed";
            }
            else
            {
                label1.Text = "Verify Fail";
            }
                btn_Stop_progress.Enabled = true;
                btn_Download.Enabled = true;
                btn_Erase.Enabled = true;
                btn_Download2.Enabled = true;
                btn_Verify_1.Enabled = true;
                label1.Refresh();
         }
         else
         {
             //check Flash 信息的函数
             result3 = csr.CSRflmVerifys("USB SPI (228077)");
             myDelegate3 md3 = new myDelegate3(Delegate_3_Run);
             this.Invoke(md3);
         }
      }  private void Thread_DisplayMSG3()
      {
          Delegate_3_Run();
      }
      
    /// <summary>
     /// 定义一个代理
     /// </summary>
     private delegate void myDelegate4();
     /// <summary>
     /// 定义一个函数,专门chck FLASH info;
     /// </summary>
     private void Delegate_4_Run()
     {            
        if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内
        {
            if (result4 == Class_Csr.TFL_OK)
            {
                label5.Text = "Verify Passed";
            }
            else
            {
                label5.Text = "Verify Fail";
            }
                btn_Stop_progress.Enabled = true;
                btn_Download.Enabled = true;
                btn_Erase.Enabled = true;
                btn_Download2.Enabled = true;
                btn_Verify_2.Enabled = true;
                label5.Refresh();
         }
         else
         {
             //check Flash 信息的函数
             result4 = csr.CSRflmVerifys("USB SPI (208811)");
             myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
             this.Invoke(md4);
         }
      }  private void Thread_DisplayMSG4()
      {
          Delegate_4_Run();
      }  private void btn_Verify_1_Click(object sender, EventArgs e)
      {
          if (txbox_Path_FW.Text == "")
          {
              MessageBox.Show("Invilid File!");
              label1.Text = "File open failed.";
              label1.Refresh();
          }
          else
          {
              label1.Text = "";
              btn_Stop_progress.Enabled = false;
              btn_Download2.Enabled = false;
              btn_Download.Enabled = false;
              btn_Erase.Enabled = false;
              btn_Verify_1.Enabled = false;
              int j = csr.CSRflmInt_SPI(cmbobox_Port_Sel.SelectedItem.ToString());
              if (j == Class_Csr.TFL_OK)
              {
                  csr.CSRflmReadProgramFiles();
                  //创建一个新的线程
                  Thread CsrTh3 = new Thread(Thread_DisplayMSG3);
                  //将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程
                  ChaosThreadList.Add(CsrTh3);//ChaosThreadList
                  CsrTh3.IsBackground = true;
                  //开启线程
                  CsrTh3.Start();
              }
          }
      }  private void btn_Verify_2_Click(object sender, EventArgs e)
      {
         if (txbox_Path_FW.Text == "")
          {
             MessageBox.Show("Invilid File!");
             label1.Text = "File open failed.";
             label1.Refresh();
          }
          else
          {
             label5.Text = "";
             label5.Refresh();
             btn_Stop_progress.Enabled = false;
             btn_Download2.Enabled = false;
             btn_Download.Enabled = false;
             btn_Erase.Enabled = false;
             btn_Verify_2.Enabled = false;
             string s = cmbobox_Port_Sel2.SelectedItem.ToString();
             int j = csr.CSRflmInt_SPI(s);
             if (j == Class_Csr.TFL_OK)
             {
                csr.CSRflmReadProgramFiles();
                //创建一个新的线程
                Thread CsrTh4 = new Thread(Thread_DisplayMSG4);
                //将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程
                ChaosThreadList.Add(CsrTh4);
                CsrTh4.IsBackground = true;
                //开启线程
                CsrTh4.Start();
             }
         }
      }  private void Form1_FormClosed(object sender, FormClosedEventArgs e)
      {
          csr.CSRflClose();
          if (ChaosThreadList.Count > 0)
          {
             //编列自定义队列,将所有线程终止
             foreach (Thread CsrTh in ChaosThreadList)
             {
                CsrTh.Abort();
             }
          }   
      }
      

  2.   

    //check Flash 信息的函数
             result4 = csr.CSRflmVerifys("USB SPI (208811)");
             myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
             this.Invoke(md4);在这里把thisInovke你可以改成md4.Invoke或者另起一线程,因为你this.Invoke会调用UI线程
      

  3.   

    能在线程里面在create 一个 线程?
      

  4.   

    即使不创建新的线程,继续使用原来的线程,也不能使用this.Invoke,这样的话,在执行时,他会使用this的创建线程(UI线程)去执行你的功能代码,这样会导致界面卡死