模态对话框阻塞了主线程 我是基于对话框程序的,在程序里我创建了另外一个线程,在这个另外创建的线程的Initial()里面我用domodel创建了一个对话框,现象是,主对话框不能使用了,主线程好像被阻塞了,我已经创建另一个线程了就算是阻塞,也应该是阻塞新创建的那个线程,怎么会是主线程? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DoModal阻塞的是消息循环,主线程不能处理消息了,所以阻塞了 线程应该不会被阻塞,只是DoModel是一个模态对话框,VC技术内幕里讲了,只有再响应完DoModel以后程序才一步一步的执行下一步骤,应该看你那个线程调用这个东西,那个线程才会阻塞 众说纷纭 ,反正DoModel会暂停执行知道处理完这个窗口的消息..所以我个人认为 调用他的线程会一直停在这个函数上直到DoModel结束 主线程没有被阻塞,是你在线程中构造对话框对象时将父窗口参数给了NULL(缺省值),这样会把主窗口作为其父窗口,模态对话框会禁用其父窗口,所以主窗口不能用了。可以在构造对话框对象时指定父窗口为CWnd::GetDesktopWindow()。 DoModal的时候,dialog会EnableWindow(hWndParent, FALSE); 调用对话框DoModal,主线程会执行到DoModal内部的消息循环处该消息循环会屏蔽所有父窗口的界面消息但是其他消息仍然路由到父窗口的消息处理比如所父窗口的定时器消息依然处理 当然是阻塞主线程,你以为还能阻力得了新建的线程?你domodel是在主线程调用的,不是在新建的线程中调用,谁调用就阻塞谁. DoModal阻塞主线程,这是常识,你可以用new出来的对话框就不会出现这种事情了。 创建的子线程需要有自己的消息循环,含有消息循环的线程,称之为用户界面线程,以下是示例代码:1.创建一个子对话框类:class CMyDlg : public CDialog{ DECLARE_DYNAMIC(CMyDlg)public: CMyDlg(CWnd* pParent = NULL); // standard constructor virtual ~CMyDlg();// Dialog Data enum { IDD = IDD_MYDLG };protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support afx_msg void OnLButtonDown(UINT, CPoint); DECLARE_MESSAGE_MAP()};BEGIN_MESSAGE_MAP(CMyDlg, CDialog) ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()void CMyDlg::OnLButtonDown(UINT, CPoint){ PostMessage(WM_CLOSE,0,0); //发送关闭窗体命令,消毁子对话框,从而退出子线程}2.添加用户界面线程类class CUIThread1 : public CWinThread{ DECLARE_DYNCREATE(CUIThread1)protected: CUIThread1(); // protected constructor used by dynamic creation virtual ~CUIThread1();public: virtual BOOL InitInstance(); virtual int ExitInstance();protected: DECLARE_MESSAGE_MAP()};IMPLEMENT_DYNCREATE(CUIThread1, CWinThread)BOOL CUIThread1::InitInstance(){ m_pMainWnd=new CMyDlg; //将子对话框地址赋给m_pMainWnd,然后显示模态对话框 CMyDlg* pDlg=(CMyDlg*)m_pMainWnd; pDlg->DoModal(); // TODO: perform and per-thread initialization here return TRUE;}int CUIThread1::ExitInstance(){ // TODO: perform any per-thread cleanup here return CWinThread::ExitInstance();}BEGIN_MESSAGE_MAP(CUIThread1, CWinThread)END_MESSAGE_MAP()3.当主对话框需要启动用户线程时,使用如下代码: CWinThread* m_UIThread=AfxBeginThread(RUNTIME_CLASS(CUIThread1),THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL); GDI+读取资源jpg图片的问题 有关图像噪声 关于多线程参数传递问题? 求助:IE中调用OCX的显示问题! /MD 和 /MT是什么意思?有何区别? 学习和交流VC的QQ群,欢迎大家加入!群号 4525522 编win32 dll 程序时,编译出错 在线求助!!!!!! 程序中的static text button上都不能显示中文 不知道如何修改 我下了一个*.bin的文件,有640M请问此文件如何用? 关于XP系统中用2005编译的程序在VISTA下运行提示side by side 的错误 VC转定义问题
该消息循环会屏蔽所有父窗口的界面消息
但是其他消息仍然路由到父窗口的消息处理
比如所父窗口的定时器消息依然处理
1.创建一个子对话框类:
class CMyDlg : public CDialog
{
DECLARE_DYNAMIC(CMyDlg)public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CMyDlg();// Dialog Data
enum { IDD = IDD_MYDLG };protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
afx_msg void OnLButtonDown(UINT, CPoint);
DECLARE_MESSAGE_MAP()
};BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()void CMyDlg::OnLButtonDown(UINT, CPoint)
{
PostMessage(WM_CLOSE,0,0); //发送关闭窗体命令,消毁子对话框,从而退出子线程
}2.添加用户界面线程类
class CUIThread1 : public CWinThread
{
DECLARE_DYNCREATE(CUIThread1)protected:
CUIThread1(); // protected constructor used by dynamic creation
virtual ~CUIThread1();public:
virtual BOOL InitInstance();
virtual int ExitInstance();protected:
DECLARE_MESSAGE_MAP()
};IMPLEMENT_DYNCREATE(CUIThread1, CWinThread)BOOL CUIThread1::InitInstance()
{
m_pMainWnd=new CMyDlg; //将子对话框地址赋给m_pMainWnd,然后显示模态对话框
CMyDlg* pDlg=(CMyDlg*)m_pMainWnd;
pDlg->DoModal();
// TODO: perform and per-thread initialization here
return TRUE;
}int CUIThread1::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}BEGIN_MESSAGE_MAP(CUIThread1, CWinThread)
END_MESSAGE_MAP()3.当主对话框需要启动用户线程时,使用如下代码:
CWinThread* m_UIThread=AfxBeginThread(RUNTIME_CLASS(CUIThread1),THREAD_PRIORITY_BELOW_NORMAL,0,0,NULL);