创建线程会在终止时挂起 MFC 对话框应用程序
Posted
技术标签:
【中文标题】创建线程会在终止时挂起 MFC 对话框应用程序【英文标题】:Creating a thread hangs MFC dialog app on termination 【发布时间】:2010-07-19 03:51:27 【问题描述】:我已经缩小了一个问题的范围。
-
我创建了一个简单的对话框应用程序
VC++ 6.0。
我在主线程之前启动了一个线程
对话框 DoModal() 被调用
我退出应用程序 - 有时
应用程序立即关闭,
其他时候它会挂起 10 秒
左右
这是什么原因造成的?我试过 _beginthread()、_beginthreadex() 和 AfxBeginThread()。他们都做同样的事情。
如果我在 DoModal() 调用之后添加 Sleep(50)(当 GUI 完成处理时),程序似乎每次都会毫无问题地终止。
使我缩小这个问题的原因是我有一个 Win32 DLL 可以做同样的事情。我的 DLL 有一个线程,我注意到使用这个 DLL 的应用程序有时需要一段时间才能停止。消除 DLL 并创建最简单的程序会产生相同的结果 - 这就是我上面所描述的。
以下是我添加到沼泽标准 MFC 对话框应用程序中的代码:
UINT Thread( void * )
for( ;; )
Sleep( 50 );
AfxEndThread( 0 );
return 0;
/////////////////////////////////////////////////////////////////////////////
// CThreadTest2App initialization
BOOL CThreadTest2App::InitInstance()
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
AfxBeginThread( Thread, 0 );
CThreadTest2Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
//Sleep( 50 ); // Works when I add this ?????
if (nResponse == IDOK)
else if (nResponse == IDCANCEL)
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
有人可以帮我正确关闭我的应用程序吗?我最终想要做的是提供一种让我的 DLL 关闭的方法,而无需通过调用应用程序明确告知它停止 thead。
谢谢 保罗
【问题讨论】:
【参考方案1】:好吧,你的线程函数中有无限循环,永远不会调用AfxEndThread
!
如果你想从外部停止线程,你必须在其中编写一个信号机制,如果你必须停止,检查循环内部。
【讨论】:
好的 - 那么为什么会有所不同呢?您在线程内添加一个标志测试并在对话框完成后设置标志 - 您将遇到同样的问题。可能需要执行 3-4 次才能明白我的意思,但请试一试。 但目前你的线程被操作系统杀死,而不是你自己。这可能会因需要的时间而异。以上是关于创建线程会在终止时挂起 MFC 对话框应用程序的主要内容,如果未能解决你的问题,请参考以下文章
猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止