线程与控件响应函数共享全局变量有关问题

线程与控件响应函数共享全局变量问题
我定义了一个全局变量,这个全局变量在线程中会循环地进行修改,但是如果界面按钮被按下,会调用按钮响应函数对该全局变量进行修改,然后线程中判断该变量的值后线程退出。
我单步调试发现该全局变量在按钮响应函数中被改过之后,接着进入线程,刚进线程变量的值就已经被莫名其妙的改变了,线程是不停的运行着的,可是单步调试看到只有响应函数中修改了该变量,线程中还没走到修改该变量的地方,不知道为什么,这种问题该怎么解决???请大神帮帮忙????
------最佳解决方案--------------------
1、确认整个程序只有一个线程?那是在什么时候判断变量值退出程序的?
2、如果是用的定时器判断那是有可能的,因为当线程空闲时会被挂起,控件响应消息来到会调相应的函数执行,执行顺序就不是你所能控制的。
3、使用临界区是可以确保同一时刻只有一个线程修改一个变量,但不能保证执行顺序
------其他解决方案--------------------
引用:
#3 w_xei
说的很对,是使用定时器来判断变量值控制线程退出的,我要在响应控件函数中改变变量值,然后让线程判断后正常退出, 那该怎么解决这个问题


你说你用定时器控制线程退出,这样在搞的确不好控制先后执行顺序啊,一般都用事件控制的,
//开始
    CTest::BegThread(){
        m_hThread = CreateThread(NULL,0,FuncThread,this,0,NULL);
        m_hDoSomething = CreateEvent(NULL,FALSE,FALSE,NULL);
        m_hExit = CreateEvent(NULL,FALSE,FALSE,NULL);
    }
    //线程的全局调用方式,或则说静态调用方式
    static DWORD CALLBACK FuncThread(LPVOID lparam);
    void _FunThread();
    CTest::FuncThread(LPVOID lparam)
    {
        CTest *pThis = (CTest*)lparam;
        pThis->_FunThread();
        return 0;
    }
    CTest::FuncThread(LPVOID lparam)
    {
        HANDLE hEvent[2] = {hExit,hDoSomething};
        while(TRUE)
        {
            DWORD dwRet = 0;
            dwRet = WaitForMultipleObjects(2,hEvent,FALSE,INFINITE);
            if (dwRet == WAIT_OBJECT_0)
            {
                return;//收到退出事件
            }
            //由于死等事件,能到这里,说明等到了dosomething事件
            //做你的事情吧--在这里可以用函数指针,函数指针用法百度去。
            //做完了事情会while到WaitForMultipleObjects继续等你的dosomething事件
            //或则退出事件
        }
        //这就达到了线程的简单控制。
        //结束线程
    }
    CTest::StopThread()
    {
        SetEvent(m_hExit);
        if (WaitForSingleObject(m_hExit,300) == WAIT_TIMEOUT)
        {
            TerminateThread(hThread,0);
        }
        CloseHandle(hThread);
    }