Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中的类内创建线程+; 我是一个初学者用C++线程。试图在类内创建线程t1,但我不希望它被初始化。为此,我做了:_C++_Multithreading - Fatal编程技术网

在C+中的类内创建线程+; 我是一个初学者用C++线程。试图在类内创建线程t1,但我不希望它被初始化。为此,我做了:

在C+中的类内创建线程+; 我是一个初学者用C++线程。试图在类内创建线程t1,但我不希望它被初始化。为此,我做了:,c++,multithreading,C++,Multithreading,在类变量中,thread*t1似乎要声明类变量而不初始化它 然后从构造器中,我做了: t1 = new Thread(functionName); 但是,有一个错误,我没有得到。我以前在Java线程方面有过简单的工作经验 假设解决方案存在于我想要实现它的方式中,这个策略是否会导致连锁问题。(如果我想访问相同的变量而不修改它)。代码如下: class game:protected gameObjects { thread *t1; ///--------------------

在类变量中,
thread*t1
似乎要声明类变量而不初始化它

然后从构造器中,我做了:

t1 = new Thread(functionName);
但是,有一个错误,我没有得到。我以前在Java线程方面有过简单的工作经验

假设解决方案存在于我想要实现它的方式中,这个策略是否会导致连锁问题。(如果我想访问相同的变量而不修改它)。代码如下:

class game:protected gameObjects
{
    thread *t1;
    ///-------------------- Variables-------------------///
    char keyPressed = NULL;
    /// structure for holding player information.
    struct player
    {
        int x, y0, y1,color;
    };
    player player1, player2;
    /// for ball
    int ballX, ballY, ballColor, ballBorderColor;

    ///--------------------------------------------------///
    void initializeData()
    {
        ballX = 42;
        ballY = 130;

        player1.color = LIGHTCYAN;
        player1.x = 30;
        player1.y0 = 100;
        player1.y1 = 200;


        player2.color = LIGHTMAGENTA;
        player2.x = 600;
        player2.y0 = 100;
        player2.y1 = 200;

        ///  Basic setUp For Game and Game Screen
        ballBorderColor = RED;
        ballColor  = GREEN;
    }

    void updateScoreBoard()
    {

        /// whole score board border.
        drawRect(20,10,620,50,RED);

        /// left score board
        drawRect(21,11,321,49,CYAN);
        setfillstyle(SOLID_FILL,CYAN);
        floodfill(30,40,CYAN);
        setbkcolor(CYAN);
        setcolor(LIGHTGREEN);
        outtextxy(35,20,"Score:0");

        ///right score board.
        drawRect(323,11,619,49,LIGHTMAGENTA);
        setfillstyle(SOLID_FILL,LIGHTMAGENTA);
        floodfill(330,40,LIGHTMAGENTA);
        setbkcolor(LIGHTMAGENTA);
        setcolor(LIGHTGREEN);
        outtextxy(350,20,"Score:1");
    }

    void ballPosition()
    {
        setfillstyle(SOLID_FILL,ballColor);
        drawCircle(ballX,ballY,10,ballBorderColor); ///ball for game
        floodfill(ballX,ballY,ballBorderColor);
    }

    void playerBatPosition()
    {
        drawLine(player1.x,player1.y0,player1.x,player1.y1,player1.color);
        drawLine(player2.x,player2.y0,player2.x,player2.y1,player2.color);
    }


    void setBackground()
    {
        setfillstyle(SOLID_FILL,background);
        drawRect(0,0,getmaxx(),getmaxy(),RED);
        floodfill(getmaxx()/2,getmaxy()/2,RED);

        drawRect(20,60,620,470,WHITE); ///white line.
    }

    void updateScreenActivity()
    {
        playerBatPosition();
    }


    void startPlaying()
    {
        do
        {
            keyPressed = _getch();
            if(keyPressed == 'w')
            {
                if(player1.y0 > 60)
                {
                    drawLine(player1.x,player1.y0,player1.x,player1.y1,background);
                    player1.y0-=5;
                    player1.y1-=5;
                }
            }
            else if(keyPressed == 's')
            {
                if(player1.y1 < 470)
                {
                    drawLine(player1.x,player1.y0,player1.x,player1.y1,background);
                    player1.y0+=5;
                    player1.y1+=5;
                }
            }

            if(keyPressed == 't')
            {
                if(player2.y0 > 60)
                {
                    drawLine(player2.x,player2.y0,player2.x,player2.y1,background);
                    player2.y0-=5;
                    player2.y1-=5;
                }
            }
            else if(keyPressed == 'g')
            {
                if(player2.y1 < 470)
                {
                    drawLine(player2.x,player2.y0,player2.x,player2.y1,background);
                    player2.y0+=5;
                    player2.y1+=5;
                }
            }
            updateScreenActivity();
        }
        while(keyPressed != 'q');
    }


     ///-------------------Threading call --------------///

        void startBallMovement(){
            cout<<"Hello world"<<endl;
        }
    ///-----------------------------------------------///


public:
    game()
    {
        cleardevice();
        initializeData();
        setBackground();
        updateScoreBoard();
        playerBatPosition();
        ballPosition();
        startPlaying();
        t1 = new thread(startBallMovement);
    }
};
类游戏:受保护的游戏对象
{
螺纹*t1;
///--------------------变数-------------------///
char-keyPressed=NULL;
///保存玩家信息的结构。
结构播放器
{
int x,y0,y1,颜色;
};
播放器播放器1、播放器2;
///为了舞会
int ballX、ballY、ballColor、ballBorderColor;
///--------------------------------------------------///
无效初始化数据()
{
ballX=42;
ballY=130;
player1.color=浅青色;
player1.x=30;
player1.y0=100;
player1.y1=200;
player2.color=浅品红色;
player2.x=600;
player2.y0=100;
player2.y1=200;
///游戏和游戏屏幕的基本设置
颜色=红色;
颜色=绿色;
}
void updateCoreboard()
{
///整个计分板边界。
drawRect(20,10620,50,红色);
///左记分板
drawRect(21,11321,49,青色);
setfillstyle(实心填充,青色);
洪水填充(30,40,青色);
蓝色(青色);
setcolor(浅绿色);
outtextxy(35,20,“分数:0”);
///右记分板。
drawRect(323,11619,49,浅品红);
setfillstyle(实心填充,浅品红);
漫灌(330,40,浅品红);
色(浅品红);
setcolor(浅绿色);
outtextxy(350,20,“分数:1”);
}
无效球位()
{
setfillstyle(实心填充,球色);
drawCircle(ballX,ballY,10,ballBorderColor);///游戏用球
泛光填充(ballX、ballY、ballBorderColor);
}
void playerbaposition()
{
抽绳(player1.x,player1.y0,player1.x,player1.y1,player1.color);
抽绳(player2.x,player2.y0,player2.x,player2.y1,player2.color);
}
虚设退步()
{
setfillstyle(实心填充,背景);
drawRect(0,0,getmaxx(),getmaxy(),红色);
泛洪填充(getmaxx()/2,getmaxy()/2,红色);
drawRect(20,60620470,白色);///白线。
}
void updateScreenActivity()
{
playerbaposition();
}
void startPlaying()
{
做
{
按键=_getch();
如果(按键=='w')
{
如果(播放器1.y0>60)
{
抽绳(player1.x,player1.y0,player1.x,player1.y1,背景);
player1.y0-=5;
player1.y1-=5;
}
}
else if(按键=='s')
{
如果(播放器1.y1<470)
{
抽绳(player1.x,player1.y0,player1.x,player1.y1,背景);
player1.y0+=5;
player1.y1+=5;
}
}
如果(按键=='t')
{
如果(播放器2.y0>60)
{
抽绳(player2.x,player2.y0,player2.x,player2.y1,背景);
player2.y0-=5;
player2.y1-=5;
}
}
否则,如果(按键=='g')
{
如果(播放器2.y1<470)
{
抽绳(player2.x,player2.y0,player2.x,player2.y1,背景);
player2.y0+=5;
player2.y1+=5;
}
}
updateScreenActivity();
}
while(按下键!=“q”);
}
///-------------------线程调用--------------///
void startBallMovement(){

cout您的类实现看起来有点糟糕。但请尝试类似的方法

class game
{
    private: thread* t;

    public:
    game()
    {
        t =  new thread([this]() {startBallMovement();} );
    }

    ~game()
    {
        if(t != nullptr)
        {
            t->join();
            delete t;
        }
    }

    void startBallMovement()
    {
    }

};

这类似于lambda表达式t=new thread([this](){startBallMovement();});。需要对此进行一些描述,@SuryaBhusal:[]告诉是一个lambda函数,[this]说对象实例将在lambda中捕获,以便您可以在lambda中使用成员函数&var。()告诉函数没有参数,然后调用函数感谢您的帮助。谢谢!!