我是靠谱客的博主 要减肥时光,最近开发中收集的这篇文章主要介绍MFC 界面假死问题解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在界面处理函数中,可以会长时间处理数据,导致界面假死,这时可以在代码块中加入下面代码:

有两种方法:
1. 单线程解决:
OnBtn1()
{
        while(m_bLoop)
       {
                your code....

              // 派发消息
               MSG	msg;
               if (PeekMessage(&msg,(HWND)NULL, 0, 0, PM_REMOVE))
               {
                        ::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);  
                }
       }
}

OnBtn2()
{
       m_bLoop = FALSE;
}
2. 多线程 (参考:http://www.vckbase.com/document/viewdoc/?id=1704)
a. 在xxxDlg.h中类的外面(即大括号外面)定义一个函数 void ThreadFunc();(外部函数)
b. 在xxxDlg类中定义在类CMultiThread1Dlg内部添加protected型变量:
HANDLE hThread;	 DWORD ThreadID;
     分别代表线程的句柄和ID。 
c. 在xxxDlg.cpp中定义全局变量volatileBOOL m_Flag;
d.在xxxDlg.cpp中写ThreadFunc函数
    void ThreadFunc()
    {
           while(m_Flag)
           {
                    //your code here
            }
           return; //线程自杀
    }
e. 按钮A代表开始循环
void CxxxDlg::OnStart()
{
         hThread=CreateThread(
               NULL,
0,	 (LPTHREAD_START_ROUTINE)ThreadFunc,	 NULL,	 0,
&ThreadID
);
}
f. 按钮B代表结束循环
void CxxxDlg::OnStop() {	m_bRun=FALSE;}

void CConsoleTestDlg::OnButtonClose() 
{
	// TODO: Add your control notification handler code here
	CButton *pBtn = (CButton *)GetDlgItem(IDC_BUTTON_CLOSE);

	if (g_isOpen)
	{
		//ConWin.Close();

		HANDLE hProcessHandle;
		ULONG nProcessID;
		HWND TheWindow;
		
		TheWindow = ::FindWindow(NULL,"console");
		::GetWindowThreadProcessId(TheWindow,&nProcessID);
		hProcessHandle = ::OpenProcess(THREAD_TERMINATE,FALSE,nProcessID);
		::TerminateProcess(hProcessHandle,4);
		
		if(pBtn != NULL)
		{
			pBtn->SetWindowText("close");
		}

		g_isOpen = FALSE;
	}
	else
	{
		ConWin.Open();
		int i;

		while(1)
		{
			g_isOpen = TRUE;

			ConWin.printf("========test======%dn",i++);
			
			// 派发消息
			MSG	msg;
			if (PeekMessage(&msg,(HWND)NULL, 0, 0, PM_REMOVE))
			{
				::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);  
            }

			Sleep(100);
		}

		if(pBtn != NULL)
		{
			pBtn->SetWindowText("close");
		}
	}
}

从别人博客中看到还可以用下方法:

/* -------------------------------------------------------------------------      
Ok, call this to pump messages... 
------------------------------------------------------------------------- */
void CDoeventsDlg::DoEvents()
{
    MSG msg;
    if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
	{
	//从Windows消息队列中取出消息 
		if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息
        {
			::PostQuitMessage(-1);
        }
		
		if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
        {
			::TranslateMessage(&msg);//转换消息
			::DispatchMessage(&msg);//发送消息
        }
	}
	
	AfxGetApp()->OnIdle(0);
	AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间
}


最后

以上就是要减肥时光为你收集整理的MFC 界面假死问题解决方法的全部内容,希望文章能够帮你解决MFC 界面假死问题解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部