首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从用户界面线程显示窗口有时会阻塞主用户界面线程。

从用户界面线程显示窗口有时会阻塞主用户界面线程。
EN

Stack Overflow用户
提问于 2014-05-06 17:23:58
回答 2查看 927关注 0票数 2

我不是MFC专家,也肯定不是多线程专家,但我仍然想了解这种奇怪的行为。在某些地方,当我在我的应用程序中创建一个MFC ui线程时,它会被启动,并且可以显示一个消息框--没有问题,主ui线程被阻塞了。但是,有时如果我创建线程,那么线程执行就会停止,直到主ui线程再次不阻塞为止。

当然,情况是编造出来的。主ui线程的阻塞表示某种形式的同步,而ui线程的消息框则表示一些更复杂的ui对话框。

这更像是一个理论问题。我主要感兴趣的是为什么会发生这种情况?以下是一个例子:

代码语言:javascript
复制
class MessageBoxThread : public CWinThread
{
    DECLARE_DYNCREATE( MessageBoxThread );
public:
    virtual BOOL InitInstance()
    {
        CWinThread::InitInstance();
        AfxMessageBox(_T("Some text"));
        return TRUE;
    }
};

IMPLEMENT_DYNCREATE( MessageBoxThread , CWinThread );


void testing()
{
    MessageBoxThread* pMessageBoxThread = new MessageBoxThread ();
    pMessageBoxThread->CreateThread();

    Sleep(10000);

    AfxMessageBox(_T("It Worked!"));
}

因此,在这个示例中,如果我将‘text’函数放入CWinApp::InitInstance中,它将按预期的方式工作(先显示“一些文本”,然后在10秒后显示“它工作了!”)。但是,如果我将其放置在应用程序内部的任意位置,则可能会在10秒睡眠后同时出现两个消息框。是什么导致了这种行为?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-07 14:59:15

好吧,我终于找到答案了。当有人创建ui线程时,该用户必须初始化包含ui线程基窗口的m_pMainWnd成员。如果没有这样做,框架将使用应用程序提供的主窗口,这是主ui线程中的窗口。因为其中一个是因为Sleep()方法而被阻塞的,所以另一个ui线程只有在主线程未被阻塞时才会响应。

票数 1
EN

Stack Overflow用户

发布于 2014-05-06 17:34:34

我不是一个MFC迷,但知道Win32,我可以看到发生了什么。将其称为“深度”,可能意味着在某些窗口消息处理代码中调用that ()函数--这是运行在主UI线程上并处理泵出消息的代码。因此,您将您的UI线程置于睡眠状态,在本例中,这与消息框或模态对话框所做的类似。因此,您的消息泵(我认为是用CWinApp实现的)被这个Sleep()阻塞,等待您完成执行代码所响应的消息(不管是什么消息)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23501093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档