首先,我正在使用 MFC 构建用户界面。然后我的问题是以下我在某个时候启动了一个 winapi 线程,一切顺利。然后,当单击按钮时,我希望该线程停止。为此,我设置了一个 bool 变量,我将其设置为 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 也声明为类的私有(private) bool 成员,线程函数在类中定义为静态函数。
最佳答案
我想我找到了问题所在。正如@SebastianRedl 指出的那样,这可能是因为我直接从该线程更新 UI。通过注释这些行,WaitForSingleObject
不再超时并且线程正确结束。
关于c++ - 停止 winapi 线程时的错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949311/