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));先写哪个号就出哪个!达不到比较的目的!!
{ 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));先写哪个号就出哪个!达不到比较的目的!!
解决方案 »
- 关于单文档 WindowProc接受消息问题?
- MFC写的程序能在自己机器上运行,但别的机器上没反应
- 用CFileDialog打开的TXT是存储在CString对象里面吗?如何对其搜索指定内容?
- WINCE界面,按钮显示前的黑框!求高手帮解决或给点思路。。
- telnet client 端的代码太难了,我找到一个,太复杂了。有没有简单点的用socket api 实现的
- *** 当toolbar左/右边停靠的时候,我想显示两列的按钮,请问怎么弄?***
- 基于UDP的socket通信问题
- 如何生成一个窗口
- 使用DB-Library函数遇到的奇怪问题
- 有谁能给我个算法?关于CDC的绘图问题
- 帮帮我:ascii码的字符形式与十六进制形式的转化
- 软件有多少天到期或者序列号是怎么实现的
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));放到窗体的初识化函数中
线程是由OS调度的。除非你在启动每个线程间加个Sleep试试。
原因就是程序运行的过快,在一个时间片就完成的话,当然就不可能体现出线程的调度。你休眠了,让CPU暂时不执行你了,这样就给其他线程机会了。(可以说成释放CPU控制权)。win32下sleep的内部实现不知道就不多说撒。你的10个线程开打的时间肯定是有顺序的,代码的顺序执行决定的。中间的调度是OS决定的。如果你想让线程不按顺序结束,就尽量拖长点时间,或者线程代码不同。制造复杂的情况,让调度不简单些。调度可是很简单的原理的,在某些情况下可理解成先进先服务(比如大家都一样短,优先级别都一样),所以很容易出现先进先出来。
个人理解。
一/ 在线程1中加sleep暂时把线程1挂起,OS会执行线程2
二/ 让线程1的执行时间大于T,由于不知道T是多少,自己测试吧
所以还是用sleep() 做为耗时的语句..XP时间片长短自己查下吧,, 估计10毫秒 甚至100毫秒? 不清楚.