C#线程绝对挑战!!!请高手亮剑!!!!

qhbycl 2008-06-30 03:46:13
最近做一个项目,需要用到多线程,
要求如下:启动一个主线程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();
}
...全文
238 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
先顶再看
nieshoushuai 2008-07-01
  • 打赏
  • 举报
回复
我觉得楼主的困惑肯定是:线程执行不了,对吧?
你可以加断电试一试,如果加断电可以的话,sleep(100);时间长一些,cpu的效率才会高一些,并且一个线程等待四个信号量,可否换一种思路?
mark_debug_sidewall() 和createBmp()
这两个线程应该做些修改,本人对你的程序不是很理解,最后一个createBmp() 要给主线程置信号。有些乱,另外线程访问的数据是否也检查一下呢?
格拉 2008-06-30
  • 打赏
  • 举报
回复
确实有点乱!
mayvac 2008-06-30
  • 打赏
  • 举报
回复
mark
yagebu1983 2008-06-30
  • 打赏
  • 举报
回复
等待信号量的设置不好办!!!
cch1010 2008-06-30
  • 打赏
  • 举报
回复
学习!
烈火焚身 2008-06-30
  • 打赏
  • 举报
回复
up
yagebu1983 2008-06-30
  • 打赏
  • 举报
回复
信号量应该是关键!!!
yagebu1983 2008-06-30
  • 打赏
  • 举报
回复
你运行程序有什麽问题???
yinshuhai 2008-06-30
  • 打赏
  • 举报
回复
没有看太明白。
不过设置全局的变量来实现状态控制。
比如:设置一个Int iState=0;
1,2,3,4二级完成后分别后iState加1,如果iState=4,则1,2,3,4都完成了,否则5号线程继续sleep。
其它的情况同理!
NewUser2008 2008-06-30
  • 打赏
  • 举报
回复
up
yoyoalphax 2008-06-30
  • 打赏
  • 举报
回复
mark...
MOTA 2008-06-30
  • 打赏
  • 举报
回复
有点晕
做标记
以后来看
guojh021 2008-06-30
  • 打赏
  • 举报
回复
有些晕,帮顶~

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧