【发布时间】: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)编写多线程软件时的常见问题。 -
这听起来很可能。还有什么其他类型的东西是这样限制的?你能推荐一个讨论这个的链接吗?
标签: c++ windows console boost-thread