各位高手好,本人新手,刚学习界面编程,以前都是在控制台下写程序,对消息机制等等也是一知半解,现在遇到一个这样的问题:
界面上有个控件,初始的文字为“开始”,当按下后,上面的文字变成“停止”,然后触发一个事件,但是这个事件是个循环,我想实现的是再次点击这个按钮,会停止循环,并将按钮的文字置为“开始”,结果是我的程序一运行就死那里了,我的代码主要部分:void CMyDlg::OnSs()  \\按下了按钮 status原始值为0,CButton m_status;
{
if(status == 0)
{
              m_status.SetWindowTextA("停止");
     status = 1;
              [一段初始化代码]
          while(status)\\在这个while就一直循环了(因为status被置1了,然后我在按钮再次被点击的时候把它置0,实际上再次点击的时候程序还一直死在这个循环里面),是否这个循环一直在的话,整个软件都不接收其他点击的消息,还是放在消息队列里面要等到当前消息触发的时间完成后才执行下面的消息?我的想法是在这里加个判断按钮被点击的条件,如果在点击后被再次点击就跳出循环,不知道这个应该怎么来判断?
          {
          另外一段执行的代码
          }
          else if(status == 1)
{
m_status.SetWindowTextA("开始");
                  status = 0;
          }
}

解决方案 »

  1.   

    clicked后开个线程去处理吧。再clicked,通知线程停止。
      

  2.   

    在按钮里写:static BOOL bStart=FALSE; //你也可把它定义为一个成员变量
    if(bStart)
      m_status.SetWindowText("停止");
    else
      m_status.SetWindowText("开始");bStart = !bStart;
      

  3.   

    将变量类型改为volatile int status ;前面加上C++关键字volatile,防止编译器优化该变量
      

  4.   

    谢谢各位,我现在用开一个线程,但是不成功,每次都出错:error C3867: “CMyDlg::sniffer”: 函数调用缺少参数列表;请使用“&CMyDlg::sniffer”创建指向成员的指针 e:\softwares\vs 2005项目\temp\对话框\对话框dlg.cpp 196
    代码如下:
    void CMyDlg::OnSs()  \\点击按钮触发的消息
    {
              if(status == 0)
    {
    m_status.SetWindowTextA("停止");
    status = 1;
    _beginthread(sniffer,0,NULL);//是不是我这样写不对?我在网上参考了别人写的程序,他的格式也是这样的,为什么我这个不行?
             }
             else if(status == 1)
             {
                      m_status.SetWindowTextA("开始");
                      status = 0;         }
    }void CMyDlg::sniffer()
    {
    函数代码
    }
      

  5.   

    to zjh824(coder):
    谢谢,不过问题不在这里,volatile int status还是不起作用