在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。()告诉函数没有参数,然后调用函数感谢您的帮助。谢谢!!