MFC WaitForSingleObject(hThread,INFINITE)执行过程中程序没有响应了
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC WaitForSingleObject(hThread,INFINITE)执行过程中程序没有响应了相关的知识,希望对你有一定的参考价值。
创建一个线程之后,我用::WaitForSingleObject(hThread,INFINITE);等待线程的执行。
结果程序失去响应了,单步调试发现在pParam->pList->AddString(output);这句时没有响应了。(我用了一个listbox控件,想往里面添加项)。
不知道为什么,难道这句话有什么不对吗?
去掉WaitForSingleObject(hThread,INFINITE)后就不会失去响应了,但是输出结果不符合逻辑……
创建多线程
HANDLE hThread;
CWinThread *pCWinThread;
pCWinThread = AfxBeginThread( CustomerProc, pParam, THREAD_PRIORITY_NORMAL);
AfxBeginThread( CustomerProc, pParam, THREAD_PRIORITY_NORMAL);
hThread = pCWinThread->m_hThread;
::WaitForSingleObject(hThread,INFINITE);
这是线程函数:
UINT CustomerProc(LPVOID param)
PARAM * pParam = (PARAM *)param;
CString output;
wchar_t temp[20] = 0;
EnterCriticalSection(&g_cs);
_itow(MYTIME, temp, 10);
output += temp;
output += L"秒 顾客";
_itow(pParam->ID, temp, 10);
output += temp;
output += L"进入理发店";
pParam->pList->AddString(output);
output.Empty();
_itow(MYTIME, temp, 10);
output += temp;
output += L"秒 顾客";
_itow(pParam->ID, temp, 10);
output += temp;
output += L"离开理发店";
pParam->pList->AddString(output);
output.Empty();
LeaveCriticalSection(&g_cs);
return 0;
最好是帖上源码,这样方便大家分析
WaitForSingleObject() 不返回 WAIT_ABANDONED
【中文标题】WaitForSingleObject() 不返回 WAIT_ABANDONED【英文标题】:WaitForSingleObject() not returning WAIT_ABANDONED 【发布时间】:2016-07-19 13:07:13 【问题描述】:我有一个 MFC 应用程序。在 InitInstance() 中,我创建了一个命名互斥体,并通过调用 WaitForSingleObject() 立即获取它。在 ExitInstance() 中,互斥体被释放。
BOOL CMyApp::InitInstance()
m_hMutex = CreateMutex( NULL, FALSE, "MyAppMutex" );
DWORD dwRes = WaitForSingleObject( m_hMutex, INFINITE );
switch( dwRes )
case WAIT_ABANDONED:
break;
case WAIT_OBJECT_0:
break;
BOOL CMyApp::ExitInstance()
::ReleaseMutex( m_hMutex );
::CloseHandle( m_hMutex );
我从 Mutex 文档中了解到,如果一个进程在没有释放获取的互斥锁的情况下退出,当另一个进程尝试获取它时,WaitForXXXObject() 将返回 WAIT_ABANDONED。
为了对此进行测试,我运行了我的应用程序并使用任务管理器将其杀死,这样 ReleaseMutex 就不会被调用。但是当我再次运行应用程序时,InitInstance() 中的 WaitForSingleObject() 返回 WAIT_OBJECT_0。这是预期的行为吗?
【问题讨论】:
很不清楚“重新启动应用程序”与此有什么关系。当您启动调用 OpenMutex() 的 另一个 进程时,您只能获得 WAIT_ABANDONED。 重新启动是指应用程序再次启动。 【参考方案1】:来自MSDN page on CreateMutex
:
当进程终止时系统会自动关闭句柄。互斥对象在其最后一个句柄被关闭时被销毁。
确实,当您终止进程时,互斥锁将处于废弃状态,但第二句话告诉我们,如果您终止打开它的唯一进程,互斥锁甚至将不再存在。
当您重新启动应用程序时,您会重新创建一个新的互斥体,因为没有其他进程拥有它的句柄。
【讨论】:
以上是关于MFC WaitForSingleObject(hThread,INFINITE)执行过程中程序没有响应了的主要内容,如果未能解决你的问题,请参考以下文章