MFC 和 AfxBeginThread 的线程调度问题

Posted

技术标签:

【中文标题】MFC 和 AfxBeginThread 的线程调度问题【英文标题】:Thread scheduling issue with MFC and AfxBeginThread 【发布时间】:2011-08-21 21:04:11 【问题描述】:

我正在使用 AfxBeginThread 在 MFC 中创建一个工作线程,但该线程没有被调度。代码如下:

CWinThread* worker = AfxBeginThread(initialUpdateWorkerThread, this);
DWORD dwExitCode = 0;
while(GetExitCodeThread(worker->m_hThread, &dwExitCode))

    if(dwExitCode != STILL_ACTIVE)
        break;
    ::Sleep(100);

当我运行它时,这个循环只是活锁,因为从不调用 initialUpdateWorkerThread(我在它的顶部放置了断点和消息框)所以 dwExitCode 总是 STILL_ACITVE。但是,如果我在循环之前但在 AfxBeginThread 之后调用 AfxMessageBox,则调用该函数。这让我觉得我没有调用正确的函数来安排线程,但是调用 AfxMessageBox 会导致它被安排。

如何强制调度线程?我认为 sleep 会这样做,但在这种情况下似乎不会。

【问题讨论】:

奇怪。您正在以最简单的方式使用 AfxBeginThread,因此它显然应该可以正常工作。那是您正在运行的确切代码,还是您传递的是其他一些参数?此外,在while 之前放置一个断点会很有趣,并查看新线程挂起的位置。 我不买。但是,您的等待循环完全无聊,它假定 SILL_EXECUTING 在忙碌时返回。没有检查它甚至开始了。您必须使用 WaitForSingleObject(worker->m_hThread) 来检测何时完成。也不需要讨厌的等待循环。 我也尝试过使用 WaitForSingleObject,但效果不佳(如果我设置了时间限制,它只会挂起或超时)。如何检查线程是否已启动?这也是我正在运行的确切代码;我从我的源文件中复制粘贴了它。 【参考方案1】:

您的工作线程可能正在尝试向您的主线程发送消息,但由于您没有在主线程上处理消息,因此工作线程只是等待。您可以通过简单地闯入调试器以查看工作线程在做什么来确认这一点。

【讨论】:

是的,你完全正确。我正在调用“((CMainFrame *)AfxGetApp()->m_pMainWnd)->EnableWindow(FALSE);”在工作函数的最顶部,我一直将断点放在较低的位置(顶部有一堆变量声明,我没有注意到其中的实际调用)。在我调用“DoMsgTranslations()”之后,它只是遍历所有消息并处理它们,在主线程中,我的工作线程现在运行。感谢您的帮助。

以上是关于MFC 和 AfxBeginThread 的线程调度问题的主要内容,如果未能解决你的问题,请参考以下文章

vc MFC 用AfxBeginThread()启动不了线程

MFC 多线程:AfxBeginThread 与 Boost.Thread?

如何使用 AfxBeginThread创建MFC线程对象和Win32线程对象

使用MFC中的AfxBeginThread创建多线程

请问MFC中AfxBeginThread的用法 基本用法我也懂 我现在要实现的是在一个线程中启动另一个线程

MFC创建线程示例