在一个for循环中,
for(int i=0;i<5;i++)
{
   // do something...
   richedit.SetSel(-1,-1);
   richedit.ReplaceSel("some words");
   
   //问题: 我想显示的some words不能很快的更新到richedit的控件中,只有等到5次完成了,才一下子把五个
   // somewords全部显示,请问如何将其一个一个的显示。
   // 注:增加函数UpdateData(false);不起作用。
}

解决方案 »

  1.   

    richedit.Invalidate()试验下另外如果有其它阻塞刷新的操作 那就得想办法分线程 或者自己写个消息循环
      

  2.   

    楼主这个功能是要做什么用?   如果之后循环里面的内容  那速度应该是超快的  就是一次显示追加5个some words  把这个放在for里面  他一个一个的步骤 你用肉眼是看不到的  楼主解释一下是要做什么功能
      

  3.   


    我的do something是往com口发送码字,然后再从com口读码字。com那边有一个线程,
    我发现写第一个码字,读第一个码字用了很长的时间,后边用到的时间就比较少。也可能
    后边的运行很快,所以好像一下子五个都显示了。哎...我有点晕掉了。
      

  4.   

    你这个需求和RichEdit无关
    应该用独立线程处理
      

  5.   

    up                                                            up                                
      

  6.   


    修改如下
    for(int i=0;i<5;i++)
    {
      // do something...
      richedit.SetSel(-1,-1);
      richedit.ReplaceSel("some words");
       
      UpdateWindow();
    }
      

  7.   

    显示一次somewords,更新一次控件
      

  8.   

    用线程去做;
    AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());UINT __cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ASSERT(hWnd);
     for(int i=0; i<5; i++)
     {
      ::PostMessage(hWnd, UM_MSG, 0, 0);
      Sleep(1000);
     }
     return 0;
    }#define UM_MSG WM_USER+111BEGIN_MESSAGE_MAP(CXXDlg, CDialog)
    ...
    ON_MESSAGE(UM_MSG, &CXXDlg::OnHandleMsg)
    END_MESSAGE_MAP()LRESULT CXXDlg::OnHandleMsg(WPARAM wParam, LPARAM lParam)
    {
     richedit.SetSel(-1,-1);
     richedit.ReplaceSel("some words");
     return 0;
    }
      

  9.   


    请问VisualEleven,我的do something可以放到线程函数中完成吗?do something函数是一个类的函数,CXXDlg::dosomething().把它也放到线程中是不是更好一些呢?
      

  10.   


    AfxBeginThread(ThreadProc, (LPVOID)GetSafeHwnd());UINT __cdecl ThreadProc(LPVOID lParam)
    {
     HWND hWnd = (HWND)lParam;
     ASSERT(hWnd);
      ::PostMessage(hWnd, UM_MSG, 0, 0);
     }
     return 0;
    }#define UM_MSG WM_USER+111BEGIN_MESSAGE_MAP(CXXDlg, CDialog)
    ...
    ON_MESSAGE(UM_MSG, &CXXDlg::OnHandleMsg)
    END_MESSAGE_MAP()LRESULT CXXDlg::OnHandleMsg(WPARAM wParam, LPARAM lParam)

       do_my_work();
       return 0;
    }void CXXDlg::do_my_work(WPARAM wParam, LPARAM lParam)
    {
       for(...)
       {
          与com线程交互;
           richedit.SetSel(-1,-1);
          richedit.ReplaceSel(显示与com交互的结果);
       }
    }我按照上边的思路做了,还是不行。我的界面依然不能及时显示出内容,必须等到循环次数全部完成才可以。
    而且,我的界面的其它按钮被堵塞,点击没有相应,必须等到与com的交互完成了,才可以显示。
      

  11.   


    我基本搞定:
    void CXXDlg::do_my_work(WPARAM wParam, LPARAM lParam)
    {
      for(...)
      {
      与com线程交互;
      richedit.SetSel(-1,-1);
      richedit.ReplaceSel(显示与com交互的结果);
      }
      while(PeekMessage())
      {
       TranslateMessage();
       DispatchMessage();
      }
    }这样就可以基本相应界面的消息了。不过还不是非常的及时。有待高手继续出招。