在单线程应用中,由用户结束大循环的方案

来源:互联网 发布:java中的sleep 编辑:程序博客网 时间:2024/06/15 01:01

在单线程应用中,我们知道,当程序进入某个需要长时间处理的函数A的时候,系统将不会响应用户的各种操作包括关闭应用程序,程序将进入假死状态,直到函数A返回;那么我们是否有机会让用户终止当前的处理呢?答案是肯定的;

由此,我们创建一个Doevent函数,该函数在用于在某个处理的过程未结束前,使得其它消息能得到被处理的机会:

 

BOOL bInLoop=FALSE; //循环标志//事件处理函数,镶入到循环中,使得其它消息有机会得到处理BOOL DoEvents(){ MSG msg; ::GetMessage(&msg,0,0, 0); if (msg.message == WM_QUIT)  {  PostQuitMessage(msg.wParam);  return FALSE; } else {  ::TranslateMessage(&msg);  ::DispatchMessage(&msg);  return TRUE; }}void CTestDlg::OnBnClickedButton1(){ bInLoop=TRUE; unsigned long x=0; while(bInLoop) {  x++;  if (x==4294967295) x = 0;  CString cs;  cs.Format(_T("%d"),x);  //加入此句是因为采用DoEvents后,用户可能不点击结束按键,而点击关闭窗口,  //加入此句用于自动结束循环  if (!IsWindow(m_hWnd))   break;  editA.SetWindowText(cs);  DoEvents();//检查是否线程是否有别的消息,有,则处理之 };}void CTestDlg::OnBnClickedButton2(){ bInLoop=FALSE;}


本文没有处理重入的情况,使用本方案,一般在OnBnClickedButton1()中,需要是Button1禁止点击