WaitForSingleObject 无限等待,阻塞主线程
时间:2010-10-16
来源:互联网
我在主界面点击按钮时弹出一个子界面,并开启一个线程,当我关闭子界面时,判断线程是否退出,如果没有退出,就用WaitForSingleObject(hThread_QAM,INFINITE); 进行等待,等到线程自己做完然后return.但是现在在这里wait变成无限等待了,主界面也一直阻塞住了...
CWinThread* wThread;
HANDLE hThread_QAM;
wThread = AfxBeginThread(theProc_QAM,NULL);
if( NULL != wThread)
{
hThread_QAM = wThread-> m_hThread;
}
UINT CQAMDlg::theProc_QAM(LPVOID p)
{
return m_pThis->QAM();
}
DWORD CQAMDlg::QAM()
{
if (INVALID_HANDLE_VALUE != hComm)
{
BOOL fWriteStat;
OVERLAPPED WRITE_OS;
CString m_addr;
int ItemCount = m_list.GetItemCount();
CriticalSection.Lock();
for (int Count = 0;Count < ItemCount;Count++)
{
//do sth;
}
CriticalSection.Unlock();
}
return 0;
}
void CQAMDlg::OnClose()
{
if(hThread_QAM)
{
DWORD exitcode1;
GetExitCodeThread(hThread_QAM,&exitcode1);
if(0 != exitcode1)
{
WaitForSingleObject(hThread_QAM,INFINITE); //现在也是无限等待了,不明白为什么啊...按理说它只会阻塞到我那边线程退出.
CloseHandle(hThread_QAM);
}
}
g_tip = "";
CDialog::OnClose();
}
CWinThread* wThread;
HANDLE hThread_QAM;
wThread = AfxBeginThread(theProc_QAM,NULL);
if( NULL != wThread)
{
hThread_QAM = wThread-> m_hThread;
}
UINT CQAMDlg::theProc_QAM(LPVOID p)
{
return m_pThis->QAM();
}
DWORD CQAMDlg::QAM()
{
if (INVALID_HANDLE_VALUE != hComm)
{
BOOL fWriteStat;
OVERLAPPED WRITE_OS;
CString m_addr;
int ItemCount = m_list.GetItemCount();
CriticalSection.Lock();
for (int Count = 0;Count < ItemCount;Count++)
{
//do sth;
}
CriticalSection.Unlock();
}
return 0;
}
void CQAMDlg::OnClose()
{
if(hThread_QAM)
{
DWORD exitcode1;
GetExitCodeThread(hThread_QAM,&exitcode1);
if(0 != exitcode1)
{
WaitForSingleObject(hThread_QAM,INFINITE); //现在也是无限等待了,不明白为什么啊...按理说它只会阻塞到我那边线程退出.
CloseHandle(hThread_QAM);
}
}
g_tip = "";
CDialog::OnClose();
}
作者: tuoya220 发布时间: 2010-10-16
子界面是个模态对话框?如果是这样的话,那么子界面不返回的话,主界面也就被阻塞了。
CQAMDlg::QAM()里的操作很耗时间?
CQAMDlg::QAM()里的操作很耗时间?
作者: dream238 发布时间: 2010-10-16
to:dream238
对,是模态对话框
void CMainFrame::OnActiveRegister()
{
CQAMDlg qam;
qam.DoModal();
}
问题是我在子界面OnClose()的时候,会阻塞在WaitForSingleObject(),这里会无限等待,整个线程都被卡死了.按理说它应该在我线程执行完成后就响应的.
CQAMDlg::QAM()是读写寄存器的操作,大概会消耗10几秒
对,是模态对话框
void CMainFrame::OnActiveRegister()
{
CQAMDlg qam;
qam.DoModal();
}
问题是我在子界面OnClose()的时候,会阻塞在WaitForSingleObject(),这里会无限等待,整个线程都被卡死了.按理说它应该在我线程执行完成后就响应的.
CQAMDlg::QAM()是读写寄存器的操作,大概会消耗10几秒
作者: tuoya220 发布时间: 2010-10-16
你用非模态对话框
作者: VisualEleven 发布时间: 2010-10-16
to VisualEleven:
void CMainFrame::OnActiveRegister()
{
/*CQAMDlg qam;
qam.DoModal();*/
CQAMDlg *qam;
qam = new CQAMDlg;
qam->Create(IDD_DIALOG_QAMREGS);
qam->ShowWindow(TRUE);
}
void CQAMDlg::OnClose()
{
if(hThread_QAM)
{
DWORD exitcode1;
GetExitCodeThread(hThread_QAM,&exitcode1);
if(0 != exitcode1)
{
WaitForSingleObject(hThread_QAM,INFINITE); //阻塞了
CloseHandle(hThread_QAM);
}
}
g_tip = "";
CDialog::OnClose();
}
依旧阻塞中....WaitForSingleObject()一直无限等待了
void CMainFrame::OnActiveRegister()
{
/*CQAMDlg qam;
qam.DoModal();*/
CQAMDlg *qam;
qam = new CQAMDlg;
qam->Create(IDD_DIALOG_QAMREGS);
qam->ShowWindow(TRUE);
}
void CQAMDlg::OnClose()
{
if(hThread_QAM)
{
DWORD exitcode1;
GetExitCodeThread(hThread_QAM,&exitcode1);
if(0 != exitcode1)
{
WaitForSingleObject(hThread_QAM,INFINITE); //阻塞了
CloseHandle(hThread_QAM);
}
}
g_tip = "";
CDialog::OnClose();
}
依旧阻塞中....WaitForSingleObject()一直无限等待了
作者: tuoya220 发布时间: 2010-10-16
相关阅读 更多
热门阅读
- office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
- 如何安装mysql8.0
阅读:31
- Word快速设置标题样式步骤详解
阅读:28
- 20+道必知必会的Vue面试题(附答案解析)
阅读:37
- HTML如何制作表单
阅读:22
- 百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
- ET文件格式和XLS格式文件之间如何转化?
阅读:24
- react和vue的区别及优缺点是什么
阅读:121
- 支付宝人脸识别如何关闭?
阅读:21
- 腾讯微云怎么修改照片或视频备份路径?
阅读:28