【发布时间】:2018-01-19 11:42:24
【问题描述】:
while (this->_data->window.isOpen()) // Main Loop
{
this->_data->machine.ProcessStateChanges();
std::thread t1 (this->_data->machine.ProcessStateChanges);
std::thread t2 (dt = _clock.restart().asSeconds());
std::thread t3 (this->_data->machine.GetActiveState()->HandleInput);
t1.join();
t2.join();
t3.join();
this->_data->display.WindowEvent(this->_data->window);
this->_data->machine.GetActiveState()->Update(dt);
this->_data->machine.GetActiveState()->Draw(dt);
我在std::thread t1 (this->_data->machine.ProcessStateChanges); 和std::thread t3 (this->_data->machine.GetActiveState()->HandleInput); 上收到一个错误——error C3867: 'StateMachine::ProcessStateChanges': non-standard syntax; use '&' to create a pointer to member 还有一个是HandleInput。通常这个错误只是告诉我我忘了把() 放在我的函数上,我知道。但是我在线程上阅读的所有内容都告诉我,在为线程提供参数时我会跳过它。两种方法我都试过了。
这两个函数是从一个共享指针指向一个名为 _data 的结构体,该结构体包含一个名为 machine 的对象(我的有限状态机)。 ProcessStateChanges 检查 _data 是否已发出任何更改堆栈的请求。获取活动状态是一个函数,它返回一个 unique_ptr 到堆栈顶部的状态。而 HandleInput 是状态中的一个函数。这些函数都没有参数。
现在,当我在没有线程的情况下运行它时,它运行良好。我希望它同时运行这些功能,主要是为了玩线程概念,并试图挤出更多的效率。但是,当我尝试将函数传递给线程时出现错误。我已经尝试过附加和不附加()。
我尝试像在问题页面start thread with member function 中那样编写它:std::thread t1(&StateMachine::ProcessStateChanges, this->_data); 除非我在这里遗漏了什么,否则它也不起作用。我收到一大页以error C2672: 'std::invoke': no matching overloaded function found开头的错误
所以我的问题是,如果它不仅仅是一个函数调用,那么当我创建一个线程时,我究竟传递了什么作为参数?对于从共享指针到包含 Class 对象的 Struct 对象和我想要调用的函数的函数调用这样复杂的东西的语法是什么?或者更复杂:指向具有类对象的结构的共享指针,该类对象具有返回对指向具有我要调用的函数的类对象的唯一指针的引用的函数?
【问题讨论】:
-
最好显示更多代码以明确您的问题。可能是抛出错误的函数的签名。
-
唯一会引发错误的是线程......如果我在没有线程的情况下运行它,一切都会正常。
-
尝试使用
std::thread t1 (&ClassName::_data->machine.ProcessStateChanges);。这应该有效。
标签: c++ multithreading shared-ptr unique-ptr