您的位置:程序门 -> vc/mfc -> 基础类



线程!!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


线程!![已结贴,结贴人:xiangfeidezhu]
发表于:2007-07-14 23:21:55 楼主
void   cdiy_mfc_multithreadingdlg::onset()  
{       cwinthread   *threags[6];
//   todo:   add   your   control   notification   handler   code   here
threags[0]=afxbeginthread(threadno1,(lpvoid)(&pparam));
threags[1]=afxbeginthread(threadno2,(lpvoid)(&pparam));
threags[2]=afxbeginthread(threadno3,(lpvoid)(&pparam));
threags[3]=afxbeginthread(threadno4,(lpvoid)(&pparam));
threags[4]=afxbeginthread(threadno5,(lpvoid)(&pparam));
threags[5]=afxbeginthread(threadno6,(lpvoid)(&pparam));
for   (int   i=0;;i++)
{
if   (pparam.m_terminate==true)
{
m_result=pparam.m_result;
m_threadid=pparam.threadid;
updatedata(false);
break;
}
}
}

uint   cdiy_mfc_multithreadingdlg::threadno1(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{

if   (pp-> m_terminate==false)
{
//singlelock.lock();
if   ((pp-> m_result=rand())> 25000)
{
pp-> m_terminate=true;
//pp-> m_threadid= "线程胜利! "
pp-> threadid=1;
break;
}
//singlelock.unlock();
}
else
{
break;
}

}
return   0;
}


uint   cdiy_mfc_multithreadingdlg::threadno2(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{
//singlelock.lock();
if   (pp-> m_terminate==false)
{
if   ((pp-> m_result=rand())> 25000)
{
pp-> m_terminate=true;
pp-> threadid=2;
break;
}
}
else
{
break;
}
//singlelock.unlock();
}
return   0;
}

uint   cdiy_mfc_multithreadingdlg::threadno3(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{
//singlelock.lock();
if   (pp-> m_terminate==false)
{
if   ((pp-> m_result=rand())==25000)
{
pp-> m_terminate=true;
pp-> threadid=3;
break;
}
}
else
{
break;
}
//singlelock.unlock();
}
return   0;

}

uint   cdiy_mfc_multithreadingdlg::threadno4(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{

if   (pp-> m_terminate==false)
{      
//singlelock.lock();
if   ((pp-> m_result=rand())> 25000)
{
pp-> m_terminate=true;
pp-> threadid=4;
break;
}
//singlelock.unlock();
}
else
{
break;
}

}
return   0;
}

uint   cdiy_mfc_multithreadingdlg::threadno5(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{
//singlelock.lock();
if   (pp-> m_terminate==false)
{
if   ((pp-> m_result=rand())> 25000)
{
pp-> m_terminate=true;
pp-> threadid=5;
break;
}
}
else
{
break;
}
//singlelock.unlock();
}
return   0;
}

uint   cdiy_mfc_multithreadingdlg::threadno6(lpvoid   pparam)
{
srand(   (unsigned)time(   null   )   );
pparam*   pp=(pparam*)pparam;//必须这样过度!
csinglelock   singlelock(&(pp-> m_section));//section也不例外!!!!!!
for   (int   i=0;;i++)
{
//singlelock.lock();
if   (pp-> m_terminate==false)
{
if   ((pp-> m_result=rand())> 25000)
{
pp-> m_terminate=true;
pp-> threadid=6;
break;
}
}
else
{
break;
}
//singlelock.unlock();
}
return   0;
}

为什么不能执行多线程?
我还发现threags[0]=afxbeginthread(threadno1,(lpvoid)(&pparam));
threags[1]=afxbeginthread(threadno2,(lpvoid)(&pparam));
threags[2]=afxbeginthread(threadno3,(lpvoid)(&pparam));
threags[3]=afxbeginthread(threadno4,(lpvoid)(&pparam));
threags[4]=afxbeginthread(threadno5,(lpvoid)(&pparam));
threags[5]=afxbeginthread(threadno6,(lpvoid)(&pparam));

先写哪个号就出哪个!达不到比较的目的!!
发表于:2007-07-15 10:20:551楼 得分:0
threags[0]=afxbeginthread(threadno1,(lpvoid)(&pparam));
threags[1]=afxbeginthread(threadno2,(lpvoid)(&pparam));
threags[2]=afxbeginthread(threadno3,(lpvoid)(&pparam));
threags[3]=afxbeginthread(threadno4,(lpvoid)(&pparam));
threags[4]=afxbeginthread(threadno5,(lpvoid)(&pparam));
threags[5]=afxbeginthread(threadno6,(lpvoid)(&pparam));

放到窗体的初识化函数中
发表于:2007-07-15 10:50:092楼 得分:15
先写哪个号就出哪个!达不到比较的目的!!
线程是由os调度的。除非你在启动每个线程间加个sleep试试。
发表于:2007-07-15 21:21:513楼 得分:0
"线程是由os调度的。 "是什么意思啊?
发表于:2007-07-15 21:22:144楼 得分:0
“放到窗体的初识化函数中”为什么啊?
发表于:2007-07-19 00:35:375楼 得分:0
为什么得加sleep啊?
发表于:2007-07-19 10:45:116楼 得分:0
加sleep是为了保证所有线程都能正常结束
发表于:2007-07-19 11:08:197楼 得分:5
sleep可释放本身的cpu控制权

你这么多线程函数都一样,为什么不用一个就得了?
发表于:2007-07-20 13:29:378楼 得分:0
sleep函数不是休眠吗?怎么回释放权限呢?
发表于:2007-07-20 23:21:269楼 得分:15
象这样测试线程是很难有差别的,偶尔也就卡的时候能有一两个位置变下。
原因就是程序运行的过快,在一个时间片就完成的话,当然就不可能体现出线程的调度。

你休眠了,让cpu暂时不执行你了,这样就给其他线程机会了。(可以说成释放cpu控制权)。win32下sleep的内部实现不知道就不多说撒。

你的10个线程开打的时间肯定是有顺序的,代码的顺序执行决定的。中间的调度是os决定的。如果你想让线程不按顺序结束,就尽量拖长点时间,或者线程代码不同。制造复杂的情况,让调度不简单些。调度可是很简单的原理的,在某些情况下可理解成先进先服务(比如大家都一样短,优先级别都一样),所以很容易出现先进先出来。
个人理解。

发表于:2007-07-23 14:04:4710楼 得分:15
cpu一般是按时间片对线程进行调度的,也就是cpu让线程1运行指定的时间t,然后再让线程2运行同样的时间t(暂时不考虑线程的优先级),依次类推,

t是由os决定的

你这么测试的话,如果线程1的执行时间小于t,那么只有当线程1执行完的时候,os才会执行线程2,所以你这么测试的话有两种改进方案,
一/   在线程1中加sleep暂时把线程1挂起,os会执行线程2
二/   让线程1的执行时间大于t,由于不知道t是多少,自己测试吧
发表于:2007-07-26 00:41:3611楼 得分:0
一般一个时间片上可以执行多少条语句啊?
发表于:2007-07-26 09:50:5412楼 得分:10
看机器速度和当前情况了,一般是n条语句吧....呵呵.
所以还是用sleep()   做为耗时的语句..

xp时间片长短自己查下吧,,   估计10毫秒   甚至100毫秒?     不清楚.


快速检索

最新资讯
热门点击