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