Ahoj všichni, pro začátek bych chtěl říct, že jsem sem nepřišel proto, aby za mně někdo udělal práci. Jsem dálkař na výšce co programuje průmyslové roboty a mám udělat malou konzolovku v Cčku. Abyste pochopili můj problém, tak prvně uvedu zadání a poté můj kód.
Mám vytvořit akvárium a v něm, aby plavaly ryby. Každá ryba má svůj thread. Množství thredu se vygeneruje pomocí argumentu zadaném na začátku a také startovní pozice ryby je vygenerována náhodně. Ryba plave od okraje k okraji, kde se otočí a plave zase dál. K tomu se má vygenerovat ještě hladina vody a ryba vždy musí plavat pod hladinou. Stěna akvária je "H", hladina "---" a ryba "XO>".
Akvárko jsem vygeneroval, rybu vypíšu a teď můj nekonečný problém. Ryba se mi neustále tiskne a místo jednoho objektu který se bude v akvárku pohybovat, se mi sice pohybuje, ale tím, že ji vlastně neustále tisknu a inkrementuji ukazatele v x-ové řadě.
Zkoušel jsem použít mutex na ten thread, ale nějak jsem nebyl úspěšný a opravdu už nevím, jak toto ošetřit, abych se mohl posunout na další bod zadání..... Strávit již 20hodin nad takovou věcí je pro mně drtivé. Níže můj kód, budu velice vděčný, když mi někdo poradí, co dělám špatně.
#include <stdio.h>
#include <time.h>
#define clear() printf("\033[H\033[J")
/*#inclue <stdlib.h>*/
/*#define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))*/
#include <windows.h>
#include <pthread.h>
#include <conio.h>
int maxxnum = 40;
int maxynum = 10;
int argcount = 3;
int numbofthread = 3;
pthread_mutex_t lock;
/*rand(x);*/
pthread_barrier_t barrier;
/*void *my_thread1(void *thread_arg){
int i=0;
rand()%maxynum;
pthread_barrier_wait(&barrier);
printf("--------------");
sleep(3);
}*/
void gotoxy( int x, int y)
{
COORD CRD;
CRD.X = x;
CRD.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CRD);
}
void *myThreadFun(void *vargp)
{
pthread_mutex_lock(&lock);
printf("XO>");
sleep(1);
pthread_mutex_unlock(&lock);
fflush(stdout);
}
int main(int x, int y, int argcount, char*arglist[])
{
pthread_mutex_lock(&lock);
int pos = 0;
/* x = rand()%maxxnum;*/
y = rand()%maxynum;
int thread_id;
for (int x1 = 0; x1<=maxxnum; ++x1 ){
printf("H");
}
for (int y1 = 0; y1 <=maxynum; ++y1){
printf("H H\n");
}
for (int x2 = 0; x2<=maxxnum+1; ++x2 ){
printf("H");
}
for (int rx = 0; rx <13; ++rx ){
gotoxy(x,y);
}
for ( int thread_id = 0; thread_id <= argcount; thread_id++){
pthread_t thread_id;
pthread_create(&thread_id, NULL, myThreadFun, NULL);
pthread_join(thread_id, NULL);
}
return EXIT_SUCCESS;
/*getch();*/
}
/*void surface(int x, int y)
{
y = 2;
srand(x);
COORD CRD;
CRD.X =x;
CRD.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), CRD);
printf("------");
COORD V={x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), V);
}*/