希望各位帮帮我,我力求言简意赅。主要的问题是在程序运行过程中界面上的控件不可控(如菜单、按钮)问题简述如下:我原先有一个console程序,需要改为MFC程序,主要是为了通过UI来监控程序进程和暂停/继续程序。我首先不考虑“暂停”功能,通过界面实现了对信息数据的显示;
然后考虑添加“暂停”功能。通过在CSDN发帖被告知将那个主函数放入一线程即可。于是我在原先的“run按钮”的消息处理函数创建了线程CMainFrame::OnRun()
{
    thread = AfxBeginThread(run, this);
}UINT CMainFrame::run(LPVOID p)
{
CMainFrame * me = (CMainFrame *)p;
me->run();
return 0;
}
 
void CMainFrame::run()
{
         SendMessage(WM_UPDATEDISPLAY);  
}其中的WM_UPDATEDISPLAY是我自定义的:如下
#define WM_UPDATEDISPLAY WM_USER + 101消息映射
ON_MESSAGE_VOID(WM_UPDATEDISPLAY, UpdateDisplay)afx_msg void UpdateDisplay(); //类消息函数
void CMainFrame::UpdateDisplay()
{
     //★★★★★★★★★★★★★★★★★★
     //  我把程序的主函数放在这里
     //  其中包括所有的运算以及数值显示在各View当中
     //★★★★★★★★★★★★★★★★★★
}这个问题困扰我一整天了。从早7;00-晚23:30.
希望明早开机看此帖时会得到好心人的帮助。
小弟先谢了!!!

解决方案 »

  1.   

    UINT UpdateDisplay(LPVOID lpParam)
    {
        CMainFrame *pWnd = (CMainFrame*)lpParam;
        ..... // 执行所有的运算以及数值显示在各View当中
    }void CMainFrame::OnRun()
    {
        thread = AfxBeginThread(UpdateDisplay, this);
    }
      

  2.   

    To: hab1980(秋艮) 
          你的方法我试过了,可是问题依旧。不过还是谢谢你。
    To:  Mackz(在相互) ( ★★)
          感谢你的建议,可是我不知道该如何改正。
    如下这篇文章描述的正是我的问题:试图在worker thread当中修改UI。希望各位看看。谢谢http://www.codeproject.com/threads/usingworkerthreads.asp
    【Worker threads and the GUI II: Don't touch the GUI】
      

  3.   

    UINT Run(LPVOID lpParam)
    {
        CMainFrame *pWnd = (CMainFrame*)lpParam;    pWnd->PostMessage(WM_UPDATEDISPLAY); // 试试这个
                                             // 我没试,不行别打我~&
    }void CMainFrame::OnRun()
    {
        thread = AfxBeginThread(Run, this);
    }
      

  4.   

    void CMainFrame::run()
    {
             //SendMessage(WM_UPDATEDISPLAY);  
             //此处不要给自己发消息,而是给view发消息
    }其中的WM_UPDATEDISPLAY是我自定义的:如下
    #define WM_UPDATEDISPLAY WM_USER + 101消息映射
    ON_MESSAGE_VOID(WM_UPDATEDISPLAY, UpdateDisplay)afx_msg void UpdateDisplay(); //类消息函数
    void CxxxView::UpdateDisplay()
    {
         //★★★★★★★★★★★★★★★★★★
         //  我把程序的主函数放在这里
         //  其中包括所有的运算以及数值显示在各View当中
         //★★★★★★★★★★★★★★★★★★
    }//试一试看行不行
    还有,就是你在你的UpdateDisplay里弄个断点,看在你发消息的时候,是否有运行这个函数,如果没有,那肯定是不行的
      

  5.   

    To: jszj
    void CMainFrame::run()
    {
             //SendMessage(WM_UPDATEDISPLAY);  
             //此处不要给自己发消息,而是给view发消息
    }
    我这里是对多个View以及status bar中的信息进行修改,怎么给所有的这些UI控件同时发消息UpdateDisplay不用设置断点,肯定运行了。
    因为我现在的问题是:各个view都可以更新,但是主窗口中的菜单和按钮不能人为控制。
      

  6.   

    hab1980(秋艮)的方法
    UINT UpdateDisplay(LPVOID lpParam)
    {
        CMainFrame *pWnd = (CMainFrame*)lpParam;
        ..... // 执行所有的运算以及数值显示在各View当中
    }void CMainFrame::OnRun()
    {
        thread = AfxBeginThread(UpdateDisplay, this);
    }
    一定可以,我都试过去了
    楼主,如果你还试不出来的话,留下个email,给你一个demo,就是按照 hab1980(秋艮)的方法
    做的
      

  7.   

    UpdateDisplay不用设置断点,肯定运行了。
    因为我现在的问题是:各个view都可以更新,但是主窗口中的菜单和按钮不能人为控制。
    --------------------------------------------------------------------------------
    哎呀,真是的,把问题说清楚点嘛,看上边的回答,都不是你想要的嘛
    “不能人为控制”是什么意思?
      

  8.   

    我的Email是: [email protected]
    非常感谢大家的帮助。另外,我说的“不能人为控制”的意思是:
    在程序运行过程中,下拉菜单和按钮不能响应鼠标。
    如:一个数从1增至10000000
    在递增过程中,按钮不能按。
    只有当递增完毕后才可以。
    而我希望在递增过程中的每时每刻都可以对其进行操作。谢谢大家了。
      

  9.   

    to 楼主兄弟:挺同情你的void CMainFrame::run()
    {
         //  你应该把程序的主函数放在这里
         //仅在需要更新界面时调用SendMessage(WM_UPDATEDISPLAY);  
         //example
         while (1)
         {
             if (some_reason_cause_thread_exit)
             {
                  break;
              }
              else
              {
                   //do your job
                   //and then update display
                   SendMessage(WM_UPDATEDISPLAY);  
              }
         }
             
    }void CMainFrame::UpdateDisplay()
    {
         UpdateWindow();
         Invalidate();
     }
      

  10.   

    只需要把界面更新的部分放到主线程去执行,你的那种方法void CxxxView::UpdateDisplay()
    {
         //★★★★★★★★★★★★★★★★★★
         //  我把程序的主函数放在这里
         //  其中包括所有的运算以及数值显示在各View当中
         //★★★★★★★★★★★★★★★★★★
    }UpdateDisplay()是在主线程中执行的,这样也可已,但是你必须在其中自己建立消息循环处理消息,否则当然无法响应界面了,因该程序的主线程就是界面线程
      

  11.   

    最简单的方法:你定义一个线程函数里面实现你想要实现的.然后在你的用户界面线程中(主线程)中调用AfxBeginThread(),肯定行的!!!
    注意:线程函数一定要定义成全局函数,或者静态函数.推荐使用全局函数.!!!!!!!!!!!!!
      

  12.   

    LRESULT CMainFrame::UpdateDisplay(WPARAM wparam,LPARAM lParam) 消息函数要有参数吧,试试看呢
      

  13.   

    如 trcd2000(胖子) 说的,消息函数有参数LRESULT CMainFrame::UpdateDisplay(WPARAM wparam,LPARAM lParam) 没看到楼主说到出现的问题是什么
      

  14.   

    To trcd2000(胖子):
         消息函数中的参数如何赋值呢?
      

  15.   

    To:  ukyoking(累) (★★)   ----------------------------------------
        只需要把界面更新的部分放到主线程去执行
       ----------------------------------------
    我的问题是:
       我的所有程序全部封装在MyProg::Run()当中了,其中包括对各view显示界面的刷新。
       无法拆分,怎么办???
      

  16.   

    为什么这么多人帮我却始终解决不了问题?是我没叙述清楚吗???我的主函数CProg::Run()是通过界面触发开始运行的。
    它的结构是这样的。for(int i=0;i<1000000;i++)
    {
      // 进行复杂的运算
      // 存于各个object当中
      // ......
      // 对UI界面进行刷新
    }整个程序的运作方式如下:1. 点击“开始”按钮
    2. 进入“Run()”的循环当中
    3. 循环结束,程序结束。
      

  17.   

    你可以找一下MFC经典问答来看
    它上面讲了手动操作UPDATE_COMMAND_UI
    不妨看看
    太长了,一下子也讲不清楚May you succeed!
      

  18.   

    我刚搜了一下 《MFC经典问答》
    看了看目录,没有发现关于线程的问答:(即将在郁闷中死去......
      

  19.   

    UI

      CreateThread(... ThreadFunc ,this...);
    }CALLBACK ThreadFunc()
    {
    for(int i=0;i<1000000;i++)
    {
       this->UpdateData();
    }
    }
      

  20.   

    楼主你要我给你讲多少遍才清楚,前面都讲了,你的那种方法导致run函数是在主线程中执行,阻塞了消息才导致界面无法操作,把你的函数改为如下吧,遇到问题要多动动脑筋,推荐你先去学习一下多线程设计CProg::Run()
    {   for(int i=0;i<1000000;i++)
      {  
        // 进行复杂的运算
        // 存于各个object当中
        // ......
        
        SendMessage(WM_UPDATEDISPLAY);  //此句对UI界面进行刷新
       }}void CMainFrame::UpdateDisplay()
    {
         UpdateWindow();
         Invalidate();
         //还可以加入你的其他更新要求
    }
      

  21.   

    热泪盈眶:我解决问题了!!!!!!!!!!!
    谢谢大家的耐心解答,尤其是 ukyoking(累) (★★★★★)
    我是按照您的方法解决问题的。致礼!  ukyoking(累) (★★★★★)
    致礼!  CSDN的良好氛围!!!!!!
      

  22.   

    热泪盈眶:我解决问题了!!!!!!!!!!!
    谢谢大家的耐心解答,尤其是 ukyoking(累) (★★★★★)
    我是按照您的方法解决问题的。致礼!  ukyoking(累) (★★★★★)
    致礼!  CSDN的良好氛围!!!!!!