【问题标题】:Wrong behavior when stopping a winapi thread停止 winapi 线程时的错误行为
【发布时间】:2018-08-21 13:01:52
【问题描述】:

首先,我正在使用 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 也被声明为类的私有 bool 成员,线程函数被定义为类中的静态函数。

【问题讨论】:

    标签: c++ multithreading winapi


    【解决方案1】:

    我想我找到了问题所在。正如@SebastianRedl 指出的那样,这可能来自我直接从该线程更新UI 的事实。通过注释这些行,WaitForSingleObject 不再超时并且线程正确结束。

    【讨论】:

    • 更新 UI 元素 - 意味着向 UI 线程发送消息并等待回复。所以只有在 UI 线程处理此消息后,您的工作线程才会退出。但他在WaitForSingleObject 里面等待并且不处理任何 ui 消息
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多