C#线程绝对挑战!!!请高手亮剑!!!!
最近做一个项目,需要用到多线程,
要求如下:启动一个主线程th_analysis ,在主线程里启动四个一级线程(t_sidewall,t_cap,t_bead,t_Bmp);其中t_Bmp要等到前边三个一级线程都完成了之后,进行某些操作。
前三个一级线程都要启动五个二级线程( 这里举例t_sidewall创建的五个线程:detect_across_overlap;detect_jointOpen;detect_density;detect_bend;mark_debug_sidewall);其中,mark_debug_sidewall要等待前边四个二级线程都完成了,进行某些操作,然后给t_Bmp一个信号;
整理一下:有点乱:
假设只有一个一级线程t_sidewall,然后在t_sidewall中启动五个二级线程detect_across_overlap;detect_jointOpen;detect_density;detect_bend;mark_debug_sidewall ;
当每个二级线程完成了之后给mark_debug_sidewall一个信号,然后当四个二级线程都完成了之后,mark_debug_sidewall执行某些操作,完事之后告诉一级线程t_Bmp一个完成信号,
同理:三个一级线程的话,一样了。
t_bmp线程完事之后给主线程一个信号,重新启动主线程。一直循环下去。
//小弟做了很长时间了,请指点一二。
不知道该中线程结构合适不?关于线程的高级操作,请您赐教,某不胜感激,分数不成问题。该程序应用在工业上,为了民族的工业化,让我们一起努力。请不吝赐教!!拜谢!!
//信号的等待触发,都是用线程的同步事件来做的。
//为了简单,把异常事件和某些操作等都去掉了
private void th_analysis()//主分析线程
{
byte[] temp_data;
while (true)
{
lock (analysis_obj)
{
if (hd_start_analysis.WaitOne(20, false))//等待有信号。
{
if ((img_data_queue.Count < 1) & snap_exit == true)
{
//退出线程
analysis_exit = true;
hd_start_analysis.Reset();//主分析线程信号终止
break;
}
else if (img_data_queue.Count > 0) //数据队列
{
//启动四个一级线程,
Thread t_sidewall = new Thread(new ThreadStart(t_sidewall));
Thread t_cap = new Thread(new ThreadStart(t_cap));
Thread t_bead = new Thread(new ThreadStart(t_bead));
//启动线程创建BMP文件,该线程要等到以上三个线程的完成信号。
Thread t_create_bmp = new Thread(new ThreadStart(t_Bmp));
t_sidewall.Start();
t_cap.Start();
t_bead.Start();
t_create_bmp.Start();
}
hd_start_analysis.Reset();//主分析线程信号终止
}//if等待有信号。
}//lock
Thread.Sleep(30);
}
}
//以下是三个一级线程的实现
private void t_cap()
{
hd_cap_finish.Set();//省略了实现过程,直接置信号位
}
private void detect_bead()
{
hd_bead_finish.Set();//省略了实现过程,直接置信号位
}
private void t_sidewall()
{
side_mutex.WaitOne();
//设置左右胎侧的缓冲区
//在此有n多操作,操作完了之后就启动二级线程。
hd_across_overlap_finish.Reset();//这些事线程同步事件
hd_jointOpen_finish.Reset();
hd_density_finish.Reset();
hd_bend_finish.Reset();
hd_side_exception.Reset();
//启动四个二级线程,如果线程操作成功,则给线程t_markDebug一个信号。
Thread _detect_across_overlap= new Thread(new ThreadStart(detect_across_overlap));
Thread t_detect_jointOpen= new Thread(new ThreadStart(detect_jointOpen));
Thread t_detect_density= new Thread(new ThreadStart(detect_density));
Thread t_detect_bend= new Thread(new ThreadStart(detect_bend));
//标记线程,该线程要等到上面的四个线程都完成了。
Thread t_markDebug = new Thread(new ThreadStart(mark_debug_sidewall));
t_detect_across_overlap.Start();
t_detect_jointOpen.Start();
t_detect_density.Start();
t_detect_bend.Start();
t_markDebug.Start();
//
side_mutex.ReleaseMutex();
}
private static Mutex bmp_mutex = new Mutex();
private void createBmp()
{
int count_bmp = 0;
while (true)
{
bmp_mutex.WaitOne();
try
{
if (hd_sidewall_finish.WaitOne(10, false))
{
count_bmp += 1;
hd_sidewall_finish.Reset();
}
if (hd_cap_finish.WaitOne(10, false))
{
count_bmp += 1;
hd_cap_finish.Reset();
}
if (hd_bead_finish.WaitOne(10, false))
{
count_bmp += 1;
hd_bead_finish.Reset();
}
if (count_bmp == 3)//表明三个二级线程都已经完成,
{
//整理图像数据,生成bmp文件,保存入队列。
if (JointAll())
{
hd_start_analysis.Set();//重新启动主分析线程
break;
}
else
{
hd_analysis_exception.Set();
break;
}
}
}
finally
{
bmp_mutex.ReleaseMutex();
Thread.Sleep(30);
}
}
}
//下面是二级线程的实现
//主要写了标记线程,
private void mark_debug_sidewall()
{
int count_mark = 0;
mark_side_mutex.WaitOne();
while (true)
{
//以下四个if语句是等待四个二级线程是否完成
if (hd_across_overlap_finish.WaitOne(10, false))
{
count_mark += 1;
hd_across_overlap_finish.Reset();
}
if (hd_jointOpen_finish.WaitOne(10, false))
{
count_mark += 1;
hd_jointOpen_finish.Reset();
}
if (hd_density_finish.WaitOne(10, false))
{
count_mark += 1;
hd_density_finish.Reset();
}
if (hd_bend_finish.WaitOne(10, false))
{
count_mark += 1;
hd_bend_finish.Reset();
}
if (count_mark == 4)
{
if (SideWall_Mark())
{
hd_sidewall_finish.Set();//一级线程的第一个(t_sidewall )已经完成。
}
else
{
hd_sideBmp_exception.Set();//异常信号置位
}
break;
}
Thread.Sleep(30);
}
mark_side_mutex.ReleaseMutex();
}