我是 C++ 新手并尝试使用 Pthread 和 Ncurses 库。我正在制作程序,它在终端屏幕上显示飞球。我创建了一个 Ball 类:
在文件 Ball.h 声明中,在 Ball.c 实现中。球.h:
class Ball {
public:
//ATTRIBUTES
char sign;
int x, y, direction, speed, color;
int width, height; //area, field size
//CONSTRUCTORS
Ball();
~Ball();
Ball(int d, int s, int yy, int xx, int c, int fH, int fW);
//s - start direction, v - speed, x,y- position, c-color
//GETTERS
//METHODS
void setAreaSize(int, int);
void moveBall(void);
};
在其他文件中是我使用此类的程序:
.../*including some libs */...
.../*declaring some attributes */...
Ball *balls;
pthread_t *threads;
int howManyBalls;
int i; //helper for loops
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
struct timespec delay = { //our speed or rather delay ;)
1,
0
};
/* Function declarations */
void initBalls(void);
void initThreads(void);
void *threadBallFunction(void *arg);
//MAIN FUNCTION ----------------------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
... /*some code*/...
initBalls();
initThreads();
... /* some code */
return 0;
}
//FUNCTIONS IMPLEMENTATIONS ----------------------------------------------------------------------------------
/* INIT BALLS */
void initBalls(void){
balls = new Ball[howManyBalls]; //creating our balls array with appropriate size
int ballY, ballX, ballDirection, ballColor;
srand(time(0)); //resetting the random number generator
for(i=0;i<howManyBalls;i++){
ballY = (rand()%(frameWidth-1))-i;
ballX = (rand()%(frameHeight-1))-i;
ballDirection = rand()%8+1;
ballColor = rand()%7+1;
balls[i] = Ball(ballDirection,2,ballX,ballY,ballColor, frameHeight, frameWidth);
}
}
void *threadBallFunction(void *threadIndex) {
do{
/* WHAT HERE ?? */
}
while(1);
}
/* INIT THREADS */
void initThreads(void){
threads = new pthread_t[howManyBalls];
void *exit_status;
int threadIdx;
for (threadIdx = 0; threadIdx < howManyBalls; threadIdx++) {
pthread_create(&threads[threadIdx], NULL, threadBallFunction, &threadIdx);
pthread_join(threads[threadIdx], &exit_status);
}
}
所以,现在我希望那个球有自己的线程。所有线程都与同一个函数联系在一起 - threadBallFunction,我将只移动一个球,哪个球?它将由传递给 threadBallFunction 的参数指定。球和螺纹应存储在单独的数组中。球数由用户输入指定。移动的球应该是无穷无尽的。
我不知道如何在这里使用互斥锁或条件变量......期待任何帮助,
//编辑:更精确的问题:
我有许多线程通过无限循环链接到同一个函数。是否可以在此函数中使用同步线程的条件变量方法?
//EDIT2(谢谢Ahmed,但是...) 好的,这对我很有帮助。非常感谢;) buuuut 可以说我希望线程无休止地工作并在每次递增时打印“计数器”值,每次递增或打印之间的时间应该是 1 秒。
例如:
计数器 = 0;
Thread1- IncCounterBy(2)
Thread2- IncCounterBy(5)
我的程序应该打印:
2(1秒后+2)
7(1秒后+5)
9(1秒后+2)
14(1秒后+5)
16(1秒后+2)
21(1秒后+5)
...直到我用 CTRL+C 停止它
如何管理这个?
亲切的问候