c++ - 停止 winapi 线程时的错误行为

标签 c++ multithreading winapi

首先,我正在使用 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/

相关文章:

c++ - 如何制作一个也包含列表的节点

c++ - win32 C++ 上的按钮样式

multithreading - 为什么我的程序用一个核心而不是两个核心更快?

c++ - 如何在windows中直接在屏幕上绘图?

c++ - 将结构化数据投影到 std::vector 的最有效方法是什么?

c++ - QT:将强类型枚举参数传递给槽

具有长时间运行计时器的 Python 线程意外退出

multithreading - 在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

windows - 使用正确的 PEB 和 ACL 从服务中创建ProcessAsUser

c++ - SetWindowsHookEx 回调函数不适用于 SYSTEM 权限