私は C++ 初心者で、Pthread および Ncurses ライブラリを使用しようとしています。端末画面に飛んでくるボールを表示するプログラムを作っています。Ball クラスを作成しました。
ファイル内で Ball.h 宣言、Ball.c 実装内。Ball.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) にリンクされています。ここで、1 つのボールだけを移動します。どのボールですか? これは、threadBallFunction に渡される引数によって指定されます。ボールとスレッドは別々の配列に格納する必要があります。ボールの数はユーザー入力によって指定されます。ボールの移動は無限でなければなりません。
ここでミューテックスまたは条件変数を使用する方法がわかりません...助けを楽しみにしています、
//編集: より正確な質問:
無限ループで同じ関数にリンクされた多くのスレッドがあります。この関数で同期スレッドの条件変数メソッドを使用することは可能ですか??
//EDIT2 (Ahmed に感謝しますが...) OK、それは私にとって本当に役に立ちます。どうもありがとうございました ;) 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 で停止するまで
これを管理する方法は?
敬具