我不是MFC专家,也肯定不是多线程专家,但我仍然想了解这种奇怪的行为。在某些地方,当我在我的应用程序中创建一个MFC ui线程时,它会被启动,并且可以显示一个消息框--没有问题,主ui线程被阻塞了。但是,有时如果我创建线程,那么线程执行就会停止,直到主ui线程再次不阻塞为止。
当然,情况是编造出来的。主ui线程的阻塞表示某种形式的同步,而ui线程的消息框则表示一些更复杂的ui对话框。
这更像是一个理论问题。我主要感兴趣的是为什么会发生这种情况?以下是一个例子:
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秒睡眠后同时出现两个消息框。是什么导致了这种行为?
发布于 2014-05-07 14:59:15
好吧,我终于找到答案了。当有人创建ui线程时,该用户必须初始化包含ui线程基窗口的m_pMainWnd成员。如果没有这样做,框架将使用应用程序提供的主窗口,这是主ui线程中的窗口。因为其中一个是因为Sleep()方法而被阻塞的,所以另一个ui线程只有在主线程未被阻塞时才会响应。
发布于 2014-05-06 17:34:34
我不是一个MFC迷,但知道Win32,我可以看到发生了什么。将其称为“深度”,可能意味着在某些窗口消息处理代码中调用that ()函数--这是运行在主UI线程上并处理泵出消息的代码。因此,您将您的UI线程置于睡眠状态,在本例中,这与消息框或模态对话框所做的类似。因此,您的消息泵(我认为是用CWinApp实现的)被这个Sleep()阻塞,等待您完成执行代码所响应的消息(不管是什么消息)。
https://stackoverflow.com/questions/23501093
复制相似问题