C++ ReadConsoleInput 不适用于 boost::thread

Posted

技术标签:

【中文标题】C++ ReadConsoleInput 不适用于 boost::thread【英文标题】:C++ ReadConsoleInput not working with boost::thread 【发布时间】:2012-08-10 22:31:22 【问题描述】:

我创建了一个侦听器类,该类将在控制器对象上调用诸如 on_left_mouse_released 之类的方法。它工作正常,现在我正在尝试使用 boost::thread 在另一个线程中运行它。但是,我似乎做错了什么。我是多线程新手,所以这很容易成为一个简单的错误。

这里是从监听器类中选择的部分:

void Listener::listen()

keepListening = true;

while(keepListening)

    if(timerEnabled)
    
        this->CheckForTimerEvent();

        if( !PendingMouseOrKeyEvents()) //readconsoleinput is blocking
            continue;
    

    if(!keepListening) //could have been changed in a timer event
        break;

    if(!mouseEnabled && !keyboardEnabled)
        continue;

    ReadConsoleInput(hIn, &InRec, 1, &NumRead);


    //see http://msdn.microsoft.com/en-us/library/windows/desktop/ms683499(v=vs.85).aspx
    //for more information on InRec and its submembers

    if(mouseEnabled &&InRec.EventType == MOUSE_EVENT)
    
        this->ProcessMouseEvent(InRec.Event.MouseEvent);
        cout << "here";
    
    else if(keyboardEnabled && InRec.EventType == KEY_EVENT)
    
        this->ProcessKeyEvent(InRec.Event.KeyEvent);
                    cout << "here";
    


void Listener::operator()()

    listen();

在我的主函数中,如果我创建一个名为 listener 的 Listener 对象,则说“listener();” 这两个 couts 都发生在适当的事件中。但是,如果我使用“boost::thread listen (boost::ref(listener));”相反,什么也没有发生。

有人知道这是为什么吗?

【问题讨论】:

ReadConsoleInput() 在非 UI 线程上调用是否安全?快速浏览文档并不能说明任何一种方式,但这是您开始为 Windows(或实际上是 MacOSX 和 ios)编写多线程软件时的常见问题。 这听起来很可能。还有什么其他类型的东西是这样限制的?你能推荐一个讨论这个的链接吗? 【参考方案1】:

您很可能已经启动了线程,但在退出测试程序之前忘记了等待线程退出。添加一个

listen.join();

在测试程序结束时。

【讨论】:

成功了。谢谢!你能推荐一些好的多线程教程吗? @Kvothe David Buttenhof 的“使用 POSIX 线程编程”是一本非常好的入门书籍,即使它只涉及 pthread。 boost 线程退出类似于 posix 线程。而且非常有趣;-)

以上是关于C++ ReadConsoleInput 不适用于 boost::thread的主要内容,如果未能解决你的问题,请参考以下文章

CascadeClassifier::detectMultiScale 不适用于 C++

VSCode/MinGW 智能感知不适用于 C++

使用重定向输入和输出的 C++ 进程间通信不适用于发布版本

qsort 在 C++ 中不适用于哪些类型?

C++:url 阅读器功能不适用于带有 \ 符号的 URL 链接。请帮助我

C++中的函数重载。不适用于 float,适用于 double [重复]