+ -
当前位置:首页 → 问答吧 → WaitForSingleObject 无限等待,阻塞主线程

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();
}

作者: tuoya220   发布时间: 2010-10-16

子界面是个模态对话框?如果是这样的话,那么子界面不返回的话,主界面也就被阻塞了。
CQAMDlg::QAM()里的操作很耗时间?

作者: dream238   发布时间: 2010-10-16

to:dream238
对,是模态对话框
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()一直无限等待了

作者: tuoya220   发布时间: 2010-10-16

热门下载

更多