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));先写哪个号就出哪个!达不到比较的目的!!

解决方案 »

  1.   

    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));放到窗体的初识化函数中
      

  2.   

    先写哪个号就出哪个!达不到比较的目的!!
    线程是由OS调度的。除非你在启动每个线程间加个Sleep试试。
      

  3.   

    加sleep是为了保证所有线程都能正常结束
      

  4.   

    Sleep可释放本身的CPU控制权你这么多线程函数都一样,为什么不用一个就得了?
      

  5.   

    Sleep函数不是休眠吗?怎么回释放权限呢?
      

  6.   

    象这样测试线程是很难有差别的,偶尔也就卡的时候能有一两个位置变下。
    原因就是程序运行的过快,在一个时间片就完成的话,当然就不可能体现出线程的调度。你休眠了,让CPU暂时不执行你了,这样就给其他线程机会了。(可以说成释放CPU控制权)。win32下sleep的内部实现不知道就不多说撒。你的10个线程开打的时间肯定是有顺序的,代码的顺序执行决定的。中间的调度是OS决定的。如果你想让线程不按顺序结束,就尽量拖长点时间,或者线程代码不同。制造复杂的情况,让调度不简单些。调度可是很简单的原理的,在某些情况下可理解成先进先服务(比如大家都一样短,优先级别都一样),所以很容易出现先进先出来。
    个人理解。
      

  7.   

    CPU一般是按时间片对线程进行调度的,也就是CPU让线程1运行指定的时间T,然后再让线程2运行同样的时间T(暂时不考虑线程的优先级),依次类推,T是由OS决定的你这么测试的话,如果线程1的执行时间小于T,那么只有当线程1执行完的时候,OS才会执行线程2,所以你这么测试的话有两种改进方案,
    一/ 在线程1中加sleep暂时把线程1挂起,OS会执行线程2
    二/ 让线程1的执行时间大于T,由于不知道T是多少,自己测试吧
      

  8.   

    看机器速度和当前情况了,一般是n条语句吧....呵呵.
    所以还是用sleep() 做为耗时的语句..XP时间片长短自己查下吧,, 估计10毫秒 甚至100毫秒?  不清楚.