Stop thread_mutex?

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod NoMoreAL 27. 1. 2022 20:26

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);
}*/
output.png
output.png (1.8 ) Zobrazeno 973 krát
NoMoreAL
Kolemjdoucí

Odeslat příspěvekod JanFiala 27. 1. 2022 21:58

Pri kresleni nejprve vykresli puvodni pozici cernou barvou (nebo tam vypis 3 mezery) a nasledne na novou pozici teprve rybu
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Just_jo 27. 1. 2022 22:43

Já bych měl za to, že pozici by vypočítalo vlákno a až main by vykresloval - aby se zajistilo nesmazání špatného bloku.
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod NoMoreAL 28. 1. 2022 07:47

Just_jo píše:Já bych měl za to, že pozici by vypočítalo vlákno a až main by vykresloval - aby se zajistilo nesmazání špatného bloku.


Taky mně to napadlo, ale v zadání stojí, že rybu generuje thread... A to prostě nevím jak vyřešit.. :/

-- 28. 1. 2022 08:47 --

JanFiala píše:Pri kresleni nejprve vykresli puvodni pozici cernou barvou (nebo tam vypis 3 mezery) a nasledne na novou pozici teprve rybu


Zkoušel jsem prvně dát mezeru a potom rybu, ale pak to vypadá tak, že se vytiskne mezera, ryba, mezera, ryba, a takhle pořád dokola..
NoMoreAL
Kolemjdoucí

Odeslat příspěvekod JanFiala 28. 1. 2022 11:17

Ono je to z principu divne.
Vlákno nemá co zasahovat do uživatelského rozhraní, k tomu slouží metoda Synchronize vlákna.
A to, kdyz spocitac novou pozici, vytisknes mezery a nasledne rybu, tak prece ten tisk mezer nemuze byt vubec videt.
A taky by po vypoctu pozice a vykresleni ryby melo nasledovat ve vlaknu nejake cekani, prece nechces, aby ryba litala jako blazen po akvarku.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod NoMoreAL 28. 1. 2022 11:35

JanFiala píše:Ono je to z principu divne.
Vlákno nemá co zasahovat do uživatelského rozhraní, k tomu slouží metoda Synchronize vlákna.
A to, kdyz spocitac novou pozici, vytisknes mezery a nasledne rybu, tak prece ten tisk mezer nemuze byt vubec videt.
A taky by po vypoctu pozice a vykresleni ryby melo nasledovat ve vlaknu nejake cekani, prece nechces, aby ryba litala jako blazen po akvarku.


Já tam měl ten sleep na to, aby to neběhalo jako splašené. A když vytisknu mezery a pak zase rybu, tak jsem myslel, že se vytisknou ty mezery a ryba a potom to samé....

Jak bych teda měl toto synchronizovat? Z toho kódu co mám bys mi to nebyl schopný ukázat nějak prosím?
V cčku dělám prvně a tyto věci teda vůbec neznám a hlavně mám taky vědomostní nedostatky v určitých principech, které jsou zde potřeba aplikovat.
NoMoreAL
Kolemjdoucí

Odeslat příspěvekod Just_jo 28. 1. 2022 15:38

Co JanFiala navrhoval bylo něco ve smyslu, že thread přepíše předchozí pozici mezerou a až pak vykreslí rybu na nové pozici.
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 29. 1. 2022 11:13

Thread jako takový standardně přímo neaktualizuje (nemá aktualizovat) rozhraní. K tomu se používá metoda threadu Synchronize, ve které thread zaktualizuje rozhraní. Když máš víc threadů tak je zajištěno, že ty Synchronize se spustí postupně a nebudou najednou aktualizovat to samé.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků