C++线程:复杂的函数语法
C++ Thread: Complicated function syntax
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 是否已发出任何更改堆栈的请求。获取活动状态的函数是returns一个unique_ptr到栈顶的状态。而 HandleInput 是状态中的一个函数。 None 这些函数接受参数。
现在,当我 运行 它没有线程时,它 运行 没问题。我希望它能够并发 运行 函数,主要是为了玩弄线程概念,并试图挤出更多的效率。但是,当我尝试将函数传递给线程时出现错误。我已经尝试过附加和不附加 ()
。
我试过像问题页 start thread with member function 中那样写它:std::thread t1(&StateMachine::ProcessStateChanges, this->_data);
除非我在这里遗漏了什么,否则它也不起作用。我收到一大页以 error C2672: 'std::invoke': no matching overloaded function found
开头的错误
所以我的问题是,如果它不仅仅是一个函数调用,那么当我创建一个线程时,我到底传递了什么作为参数?对于像从共享指针到 Struct 对象的函数调用这样复杂的东西,语法是什么? Struct 对象包含一个 Class 对象和一个我想调用的函数?或更复杂:指向结构的共享指针,该结构具有 class 对象的功能 returns 对指向 class 对象的唯一指针的引用,该对象具有我的功能想打电话吗?
虽然我很感谢您的帮助,但 none 的答案实际上解决了我的问题。也许这可能是我的描述有问题。
但是,我通过创建一个仿函数解决了它:
auto functor = [&](){this->_data->machine.ProcessStateChanges();};
std::thread t1(functor);
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 是否已发出任何更改堆栈的请求。获取活动状态的函数是returns一个unique_ptr到栈顶的状态。而 HandleInput 是状态中的一个函数。 None 这些函数接受参数。
现在,当我 运行 它没有线程时,它 运行 没问题。我希望它能够并发 运行 函数,主要是为了玩弄线程概念,并试图挤出更多的效率。但是,当我尝试将函数传递给线程时出现错误。我已经尝试过附加和不附加 ()
。
我试过像问题页 start thread with member function 中那样写它:std::thread t1(&StateMachine::ProcessStateChanges, this->_data);
除非我在这里遗漏了什么,否则它也不起作用。我收到一大页以 error C2672: 'std::invoke': no matching overloaded function found
所以我的问题是,如果它不仅仅是一个函数调用,那么当我创建一个线程时,我到底传递了什么作为参数?对于像从共享指针到 Struct 对象的函数调用这样复杂的东西,语法是什么? Struct 对象包含一个 Class 对象和一个我想调用的函数?或更复杂:指向结构的共享指针,该结构具有 class 对象的功能 returns 对指向 class 对象的唯一指针的引用,该对象具有我的功能想打电话吗?
虽然我很感谢您的帮助,但 none 的答案实际上解决了我的问题。也许这可能是我的描述有问题。
但是,我通过创建一个仿函数解决了它:
auto functor = [&](){this->_data->machine.ProcessStateChanges();};
std::thread t1(functor);