当前位置:编程学习 > C#/ASP.NET >>

2个线程同时做同一个操作,不影响主线程的其他操作

现在我已经用硬件实现了check 产品flash的信息。但现在我想同时检查两个产品Flash的信息。必须用线程实现。现在我的UI界面是check1 button,和check2 button.现在我点击一个按钮后,会开启一个线程,会通过硬件来查找Flash的信息。这个查找过程是通过调用其他DLL提供的函数实现。现在我点击check1 button后,我的主窗体,就会无反应,卡在那。现在我想在点击按钮1后,check 产品1的Flash,然后立马点击2按钮,来同时check 产品2的FLAH信息。
     现在想请大侠们指教下线程方面的只是。没怎么用过多线程。 --------------------编程问答-------------------- 感觉好像点击Check1Button后没有启线程呢,要是启线程的话不会卡主UI线程的 --------------------编程问答-------------------- 贴代码吧,你这样说,谁知道你代码有什么问题~ --------------------编程问答-------------------- 代码如下:

  /// <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();
         }
      }   
  }
--------------------编程问答-------------------- ,以上是我的UI界面。以及想实现的功能说明。请大侠们帮忙给个思路,谢谢。以前没做过线程。写的程式都是单线程,容易卡死。现在要求写成多线程。 --------------------编程问答--------------------
引用 2 楼 wpfLove 的回复:
贴代码吧,你这样说,谁知道你代码有什么问题~

我已经贴上代码和说明了,能帮忙看看嘛
--------------------编程问答-------------------- //check Flash 信息的函数
         result4 = csr.CSRflmVerifys("USB SPI (208811)");
         myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
         this.Invoke(md4);

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

在这里把thisInovke你可以改成md4.Invoke或者另起一线程,因为你this.Invoke会调用UI线程
能在线程里面在create 一个 线程?
--------------------编程问答--------------------
引用 7 楼 hylf1985 的回复:
Quote: 引用 6 楼 wpfLove 的回复:

//check Flash 信息的函数
         result4 = csr.CSRflmVerifys("USB SPI (208811)");
         myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
         this.Invoke(md4);

在这里把thisInovke你可以改成md4.Invoke或者另起一线程,因为你this.Invoke会调用UI线程
能在线程里面在create 一个 线程?

即使不创建新的线程,继续使用原来的线程,也不能使用this.Invoke,这样的话,在执行时,他会使用this的创建线程(UI线程)去执行你的功能代码,这样会导致界面卡死
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,