struct threadinforM
{
UINT NSECOND;
CProgressCtrl * pc;
};//一个全局变量结构体
UINT Thfun(LPVOID lpParam);//线程函数
void CMuthread3Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
infor.NSECOND = m_second;
infor.pc = &m_ctr;
hthread = CreateThread(
NULL,0,
(LPTHREAD_START_ROUTINE)Thfun,
&infor,
0,
&threadID);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
WaitForSingleObject(hthread,INFINITE);//导致线程死锁
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
}
UINT Thfun(LPVOID lpParam)
{
threadinforM * pinfo = (threadinforM * )lpParam;
for (int i=0;i<100;i++)
{
int ntem = pinfo->NSECOND;
pinfo->pc->SetPos(i);
Sleep(ntem);
}
return 0;
}书上的讲解是:::
WaitForSingleObject函数等待子线程(ThreadFunc)结束时,导致了线程死锁。因为WaitForSingleObject函数会将主线程挂起(任何消息都得不到处理),而子线程ThreadFunc正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事件。这样两个线程都在互相等待,死锁发生了
麻烦高手给我讲解一下,子线程在等待什么??这个是怎么导致线程死锁的
{
UINT NSECOND;
CProgressCtrl * pc;
};//一个全局变量结构体
UINT Thfun(LPVOID lpParam);//线程函数
void CMuthread3Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
infor.NSECOND = m_second;
infor.pc = &m_ctr;
hthread = CreateThread(
NULL,0,
(LPTHREAD_START_ROUTINE)Thfun,
&infor,
0,
&threadID);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
WaitForSingleObject(hthread,INFINITE);//导致线程死锁
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
}
UINT Thfun(LPVOID lpParam)
{
threadinforM * pinfo = (threadinforM * )lpParam;
for (int i=0;i<100;i++)
{
int ntem = pinfo->NSECOND;
pinfo->pc->SetPos(i);
Sleep(ntem);
}
return 0;
}书上的讲解是:::
WaitForSingleObject函数等待子线程(ThreadFunc)结束时,导致了线程死锁。因为WaitForSingleObject函数会将主线程挂起(任何消息都得不到处理),而子线程ThreadFunc正在设置进度条,一直在等待主线程将刷新消息处理完毕返回才会检测通知事件。这样两个线程都在互相等待,死锁发生了
麻烦高手给我讲解一下,子线程在等待什么??这个是怎么导致线程死锁的
MFC里很多成员函数都是通过消息来实现的,就像SetPos也是这样,跨线程的SendMessage会导致当前线程被挂起,直到对方响应消息完才恢复(印象中好像是这样,具体可参考windows核心编程第四版第26章),而主线程waitforsingleobject要一直等子线程自然结束(线程结束了,句柄这个内核对象才会变成有信号状态,wait才会返回)退出了才会返回,所以就会出现死锁
++还有跨线程使用mfc类的问题。如果不是mfc类,可以使用msgwaitformutipleobjects这个函数
具体可以参考文章
http://blog.csdn.net/qingfeng_happy5/article/details/3515283