创建线程会在终止时挂起 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()线程暂停继续终止

在 MFC 中同时挂起 2 个线程的问题!

播放框架在启动时挂起:“正在加载项目定义”

ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起

Facebook iOS SDK 在应用启动时挂起

独立的 Windows 应用程序在焦点更改时挂起