首先,我正在使用MFC构建用户界面。然后我的问题是以下我在某个时候启动了winapi线程,进展顺利。然后,当单击按钮时,我希望该线程停止。为此,我设置了一个布尔变量,将其设置为True,然后希望它会中断线程循环,并在短时间后关闭线程。这是我正在做的简化版本。
HANDLE LoadDataThread
DWORD LoadDataThreadId
void DialogClass::CreateThreadRP() {
LoadDataThread = CreateThread(NULL, 0, LoadData, (void*)this, 0,
&LoadDataThreadId);
}
DWORD WINAPI DialogClass::LoadData(void* lpParam) {
DialogClass* This = (DialogClass*)lpParam;
// Some initializations...
for(int i=0; i<100 && !This->stopThread; i++) {
// Operations taking some time (between 30 and 50ms)
// Plus updating UI elements
}
return 0;
}
最后,我们创建一个结束线程函数来告诉我们,如果尚未完成,则需要退出循环。
void DialogClass::EndThreadRP() {
stopThread = TRUE;
DWORD result = WaitForSingleObject(LoadDataThread, 500);
}
这里的问题是,等待单个对象总是超时,然后线程退出。我将超时增加到1000,甚至是无限的,但是它没有改变(随着无限,程序冻结)。似乎WaitForSingleObject
阻止了线程的运行。另外,将stopThread声明为该类的私有布尔成员,并且将线程函数定义为该类中的静态函数。
答案 0 :(得分:1)
我认为我找到了问题。正如@SebastianRedl指出的那样,这可能是由于我正在直接从此线程更新UI所致。通过注释这些行,function mapDispatchToProps(dispatch) {
return {
getLocations:(data) => getCity(data),
logStore: () => dispatch({type:'LOGSTORE'})
}
}
不再超时并且线程正确结束。