如何在C ++中的新线程中运行非静态函数

时间:2018-09-12 00:49:54

标签: c++ multithreading class non-static

我正在尝试用C ++编写基本游戏。我有一个名为player的类,具有一个名为 moveLeft(); 的函数,该函数不断监视要在单独线程中运行的“ a”获取。

以我认为的方式来称呼它。我现在知道这是因为它是一个非静态函数,但是我不确定现在如何执行此操作。我正在使用库。

播放器类

#pragma once
class player
{
    public:
        player(); // Constructor
        ~player(); // Destructor

        void moveLeft();
        void moveRight();
        void jump(double);

        int getHealth();

        double get_x_position();
        double get_y_position();

        double get_x_momentum();
        double get_y_momentum();

        bool getGrounded();

        void setHealth(int);

        void set_x_position(double);
        void set_y_position(double);

        void set_x_momentum(double);
        void set_y_momentum(double);

        void setGrounded(bool);

    private:
        int health;

        bool grounded;

        double x_position;
        double y_position;

        double x_momentum;
        double y_momentum;
};

moveLeft()函数

void player::moveLeft()
{
    while (true)
    {
        while (GetKeyState(97))
        {
            if (grounded)
            {
                x_momentum -= .01;
            }
            else
            {
                x_momentum -= 0.07;
            }

            x_position += x_momentum;
        }
    }
}

我以为我应该设置它。

thread t1(&player::moveLeft);
t1.detach();

4 个答案:

答案 0 :(得分:4)

如果要从类的成员函数启动线程,则可能正在寻找

thread t1(&player::moveLeft, this);
t1.detach();

之所以包含this指针,是因为每个成员函数都有一个隐藏参数,即指向与其关联的对象的指针。上面的代码中的thisplayer*。当然,您可以使用任何其他指向player的指针,而不必使用this。无论您指向什么对象,成员函数都会在其体内将其视为“此对象”。

答案 1 :(得分:2)

如果要那样做,则需要创建播放器类的实例

player *myplayer = new player(); //do this in your initializer, not for every call.
thread t1(&player::moveLeft, myplayer);
t1.detach();

如果您只想要一个玩家实例,则在另一个回复中发布的单例方法将起作用。

答案 2 :(得分:0)

敬重-我认为您的程序结构或总体设计不合适。

  • 您不应在问题域对象的方法内进行事件处理或I / O处理。
  • 如果运动发生的时间受到限制(例如,直到发生某些事情就不向左移动)-为什么要公开暴露立即运动的方法(例如set_x_position())?
  • 如果您有琐碎的获取者和安装者,为什么还要打扰私人成员?不是真的应该丢掉二传手吗?
  • 播放器类实例在多个线程之间共享。在其中之一进行更改时,是否应该以某种方式锁定它?

不过,要回答您的具体问题:

auto l = [&]() { player1.moveLeft(); }
auto t1 = std::thread{l};
t1.detach();

答案 3 :(得分:-1)

您可以使用std::bind解决此问题。

thread t1(std::bind(&player::moveLeft,this));
t1.detach();