我在视内的OnTimer()中写了这段代码,当打开文件时,发现该文件已被其他进程打开,于是循环打开文件看是否成功,若成功则写入文件,代码如下:
CXXXView::OnTimer(...)
{
  CStdioFile BilFile;
  CString strFile=_T("C:\\abc.txt");
  KillTimer();
  BOOL bSuccess=FALSE;
  CErrorDlg Dlg;
  do 
 {
    if(FileExist(strFile))
      {
bSuccess=BilFile.Open(strFile,CFile::modeWrite,&e);
        }
   else
     {
       bSuccess=BilFile.Open(strFile,CFile::modeCreate|CFile::modeWrite,&e);
      }
   if (bSuccess==FALSE)
    {
      char strError[256];
      memset(strError,0,256);
      e.GetErrorMessage(strError,255,NULL);
      if (FromHandle(Dlg.m_hWnd)==NULL)
      {
Dlg.Create(IDD_DIALOG_MESSAGE,this);
         Dlg.m_strError=TmpStr;
Dlg.CenterWindow(this);
Dlg.ShowWindow(SW_NORMAL);
Dlg.UpdateWindow();
       }
  }
  Sleep(100);//请问我显示上面的对话框后就不能刷新视了,为什么,该如何写?********************
  }while(bSuccess==FALSE);
  if(FromHandle(Dlg.m_hWnd)!=NULL)
 {
   //请问:是否有必要消除创建的对话框,该如何清除?******************************
 }
 BilFile.SeekToEnd();
 BilFile.WriteString(szTmp);
 BilFile.Close();
 KillTimer();
 return;
 }
该如何写这段代码*************************************?

解决方案 »

  1.   

    在 Dlg.UpdateWindow(); 后面在加上一句刷新视图的语句:this->Invalidate();
      

  2.   

    你的ontimer和视图在一个线程中,如果ontimer工作,其他地方肯定阻塞,除非你将ontimer的功能放到一个新的线程中,就不会阻塞主线程了
      

  3.   

    向这种可能会发生阻塞的操作,最好放在线程中处理
    如Sleep(100);//
    就会发生阻塞了,所以建议你在线程中处理
      

  4.   

    AfxBeginThread((AFX_THREADPROC)MyThread,this);//开线程DWORD WINAPI MyThread(LPVOID lpParam)
    {
    //你的代码在这里写
    }