停止winapi线程时的错误行为

时间:2018-08-21 13:01:52

标签: c++ multithreading winapi

首先,我正在使用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声明为该类的私有布尔成员,并且将线程函数定义为该类中的静态函数。

1 个答案:

答案 0 :(得分:1)

我认为我找到了问题。正如@SebastianRedl指出的那样,这可能是由于我正在直接从此线程更新UI所致。通过注释这些行,function mapDispatchToProps(dispatch) { return { getLocations:(data) => getCity(data), logStore: () => dispatch({type:'LOGSTORE'}) } } 不再超时并且线程正确结束。