C ++线程:复杂的函数语法

时间:2017-08-11 04:32:11

标签: c++ multithreading shared-ptr unique-ptr

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对象的共享指针?或者更复杂:一个指向结构的共享指针,该结构具有一个类对象,该类对象具有一个函数,该函数返回对具有我想要调用的函数的类对象的唯一指针的引用?

1 个答案:

答案 0 :(得分:0)

虽然我很感激帮助,但没有一个答案真正解决了我的问题。也许这可能与我的描述有关。

但是,我通过创建一个仿函数来解决它:

auto functor = [&](){this->_data->machine.ProcessStateChanges();};

std::thread t1(functor);