问题是这样的,程序中有一个按钮,点击此按钮,程序让编辑框A显示:“Programmer is programming!”,然后进行算法处理。算法处理OK后,编辑框A显示:“Programming is done.”
简单演示代码如下:
void CFRDlg::OnPorgress()
{
m_log.SetWindowText("Programmer is programming."); for(int i=0; i<100000000; i++){

}
m_log.SetWindowText("programming is done.");
}问题是,编辑框只能等到算法实现后才会显示:programming is done. 它不会显示:Programmer is programming。
我尝试过用消息等方式来处理,结果都不理想。请大家提供个能实现此功能的思路。A thousand thanks.

解决方案 »

  1.   

    To fishion,测试过了,效果依旧不行。请问还有什么别的方法吗?
      

  2.   


    此方法,我昨天试过了,还是不行,代码如下:
    void CFRDlg::OnProgramming() 
    {
            SendMessage(WM_MYMSG,0,0);
    m_x=m_x+1;
    m_z=m_z+1;
    UpdateData(FALSE);
    }void CFRDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
    {  
        SetDlgItemText(IDC_LOG,"FR is programming...");
        UpdateData(FALSE);
        for(int i=0; i<1000000000000; i++){
    }
        m_log.SetWindowText("programming is done.");
    }请问是我代码写的有问题?还是思路不对? 请指教,谢谢!
      

  3.   

    可以把 for(int i=0; i <1000000000000; i++){ 

    放入线程里,然后在循环结束了,在发消息,处理 m_log.SetWindowText("programming is done."); 
      

  4.   

    假定类名字CMyClass.采用线程方法可以实现。
    先声明消息响应函数:CMyClass.h文件 定义#define WM_MYUPDATEEDIT WM_USER+1001, LRESULT OnUpdateEdit(WPARAM wParam, LPARAM lParam).CMyClass.cpp文件,MFC 的消息响应BEGIN_MESSAGE_MAP中增加ON_MESSAGE(WM_MYUPDATEEDIT, OnUpdateEdit), 消息函数实现:
    LRESULT CMyClass:OnUpdateMyEdit(WAPRAM wParam, LPARAM lParam)
    {
      int nState = (int)wParam;
      if(nState == 0)
         GetDlgItem(IDC_LOG)->SetWindowText("FR is programming...");
      if(nState == 1)
         GetDlgItem(IDC_LOG)->SetWindowText("programming is done.");}
    void CFRDlg::OnProgramming() 
    {
        AfxBeginThread(MyProgrammingThread, this);
    }//线程函数
    UINT MyProgrammingThread(LPVOID lpVoid)
    {   CMyClass *pMyClass = (CMyClass*)lpVoid;
       pMyClass->PostMessage(WM_MYUPDATEEDIT, 0, 0);
       for(int i=0; i <100000000; i++){    } 
       pMyClass->PostMessage(WM_MYUPDATEEDIT, 1, 0);  
    }
      

  5.   

    汗,显示“Programmer is programming!”和进行算法运算之后显示“Programming is done.” 分成2个函数不就好了...
      

  6.   

    在对话框界面中,由于大量计算工作在里面,消息响应会被阻塞,需要将这种大计算量的工作给worker thread才行。
      

  7.   


    请您说清楚点,我自己试过类似您说的方法,但是达不到我要的要求。演示代码如下:void CFRDlg::Test1()
    {
    m_log.SetWindowText("Programmer is programming."); 
    }void CFRDlg::Test2()
    {
    m_log.SetWindowText("programming is done.");
    }void CFRDlg::OnPorgress() 

    Test1(); 
    for(int i=0; i <100000000; i++){ 

    Test2();
    } 请问,您是指的这个方式吗?但是我试过不行。
      

  8.   

    m_log..SetWindowText("Programmer is programming."); for(int i=0; i <100000000; i++){ } 
    m_dfdf.SetFocus();//少了这句不行
    Sleep(1000);
    m_log.SetWindowText("programming is done."); 勉强行,我也搞不清怎么回事
      

  9.   


    谢谢,这是最简单的方式。
    将m_log,SetWidnowText(),置前Sleep就可以不要了。m_log..SetWindowText("Programmer is programming."); 
    m_log.SetFocus();
    for(int i=0; i <100000000; i++)


    m_log.SetWindowText("programming is done."); Thanks a lot.
      

  10.   


    界面上面应该快速响应你的计算结果,而不是为了显示一个状态字符串而挂起1秒钟。这样子,你的界面会给人一种反映迟钝的感觉。把大量计算给worker线程,线程和界面之间采用消息传递,这样子你的线程会给人一种反应非常灵敏的感觉。