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