MFC 线程类CWinThread的用法,实现两个窗口互不阻塞 20
我在原来只有一个主对话框的情况下创建了一个新对话框资源,里面有一个按钮classCMonitorDlg:publicCDialog{DECLARE_DYNAMIC(CMo...
我在原来只有一个主对话框的情况下创建了一个新对话框资源,里面有一个按钮 class CMonitorDlg : public CDialog { DECLARE_DYNAMIC(CMonitorDlg)..... 然后双击按键响应的函数 void CMonitorDlg::OnBnClickedOk() { int i=1; // TODO: 在此添加控件通知处理程序代码 while(1) {i++;} //OnOK(); } 然后从CWinThread派生了一个类 class CMonitorThread : public CWinThread 在类中定义一个对话框成员 CMonitorDlg m_dlgMonitor; 然后重载 virtual BOOL InitInstance() { m_dlgMonitor.Create(IDD_MONITOR);//id就是前面创建的新资源 m_dlgMonitor.ShowWindow(SW_SHOW); m_pMainWnd=&m_dlgMonitor; } 完成上面的工作后我在主窗口的一个按钮响应函数里启动了这个线程类 CMonitorThread *p=(CMonitorThread *)AfxBeginThread(RUNTIME_CLASS(CMonitorThread),0); 工程顺利通过编译,但是运行的时候我点击启动线程按键,弹出新对话框, 当我双击新对话框的按键,也就是那个死循环函数时,发现不单是新对话框卡住了, 主对框也响应不了任何消息,我线程类用的方法不对吗,为什么会这样?
展开
4个回答
展开全部
MFC中用AfxBeginThread来启动新线程,不要直接使用CWinThread类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你在while(1){i++}加句代码sleep(1000);
再运行下 看看还会不会卡 这种死循环运行太快,时间片切换的时候容易出问题
再运行下 看看还会不会卡 这种死循环运行太快,时间片切换的时候容易出问题
更多追问追答
追问
试过了还是阻塞住主界面了,是不是我用这个类的方法不对呢
追答
问题出在你那万恶的死循环上了,你想一下啊你的进程一直在死循环里,也是就程序一直在等待响应你的双击事件,因为你的CMonitorDlg::OnBnClickedOk() 一直没有执行完,所以那个进程的消息队列锁死了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你需要在线程死循环函数里放置Sleep或者等待信号量。这就能把CPU时间交给别的线程了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-02-12
展开全部
你能把你的工程打个包上传嘛? 光看你说实际代码是怎样的好难猜啊,找个地方上传下吧;方便大家帮你查错
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询