WaitForSingleObject 无限等待,阻塞主线程

tuoya220 2010-10-16 10:08:43
我在主界面点击按钮时弹出一个子界面,并开启一个线程,当我关闭子界面时,判断线程是否退出,如果没有退出,就用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();
}
...全文
1516 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuoya220 2010-10-16
  • 打赏
  • 举报
回复
但是如果在
void CQAMDlg::OnClose()
{
g_tip = "";
CDialog::OnClose();
}
不等待,退出就没问题,线程会在后台自己运行,一直到执行完毕后return掉.
tuoya220 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()一直无限等待了
tuoya220 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()...
Eleven 2010-10-16
  • 打赏
  • 举报
回复
你用非模态对话框
Eleven 2010-10-16
  • 打赏
  • 举报
回复
你用非模态对话框
tuoya220 2010-10-16
  • 打赏
  • 举报
回复
to:dream238
对,是模态对话框
void CMainFrame::OnActiveRegister()
{
CQAMDlg qam;
qam.DoModal();
}
问题是我在子界面OnClose()的时候,会阻塞在WaitForSingleObject(),这里会无限等待,整个线程都被卡死了.按理说它应该在我线程执行完成后就响应的.
CQAMDlg::QAM()是读写寄存器的操作,大概会消耗10几秒
tuoya220 2010-10-16
  • 打赏
  • 举报
回复
to:dream238
CQAMDlg是弹出来的子界面,对
void CMainFrame::OnActiveRegister()
{
CQAMDlg qam;//这里调用的
qam.DoModal();
}
进入CQAMDlg以后才开的线程,现在就是阻塞在WaitForSingleObject上面,这里会无限等待,没有返回,但是实际上不应该是等到我的线程执行完就响应了吗?我线程又不是个while()循环....
CQAMDlg::QAM()这里面是读写寄存器的操作,大概要10多秒吧
ArcRain 2010-10-16
  • 打赏
  • 举报
回复
子界面是个模态对话框?如果是这样的话,那么子界面不返回的话,主界面也就被阻塞了。
CQAMDlg::QAM()里的操作很耗时间?
ArcRain 2010-10-16
  • 打赏
  • 举报
回复
CQAMDlg是主界面吧?在主界面里调用了OnClose(),然后WaitForSingleObject一直没返回当然就阻塞到了主界面了。
QAM()里的//do sth; 很耗时间?

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧