Robie programik w C (a w zasadzie małą grę) na zaliczenie w ncurses i stanąłem przed pewnym problemem. Mianowicie potrzebuje pobrać za pomocą funkcji scanw (choć może być też inna, to nie ma znaczenia) od użytkownika numer pola, które następnie ma być zaznaczone w grze. Gracz ma mieć na to powiedzmy 5 sekund, po upływie których wykona się jakiś losowy ruch. Próbowałem stworzyć drugi wątek za pomocą pthread i w ramach nauki napisałem program i oto, co mi wyszło:
#include <curses.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define sekunda 1000000
void *stoper(void *czas);
void *wpisz(void *stan);
int main() {
pthread_t watek1,watek2;
float *czasPrzekazywany;
int *stanPrzekazywany;
czasPrzekazywany = (float*) malloc(sizeof(float));
*czasPrzekazywany=5;
stanPrzekazywany = (int*) malloc(sizeof(int));
*stanPrzekazywany=0;
initscr();
curs_set(1);
pthread_create(&watek1, NULL, stoper, (void*) czasPrzekazywany);
pthread_create(&watek2, NULL, wpisz, (void*) stanPrzekazywany);
getch();
pthread_join( watek1, NULL);
pthread_join( watek2, NULL);
endwin();
free(czasPrzekazywany);
free(stanPrzekazywany);
return 0;
}
void *stoper(void *czas) {
float *czasRzut, i;
czasRzut=(float*) czas;
for (i=0; i<=10*(*czasRzut); i++) {
mvprintw(5,5,"%.1f",(*czasRzut)-i*0.1);
refresh();
usleep(sekunda/10);
}
mvprintw(5,5,"0.0");
refresh();
return (void*) czas;
}
void *wpisz(void *stan) {
int stanRzut,cyfra;
stanRzut=(int*) stan;
mvscanw(6,5,"%d",&cyfra);
if (cyfra == 6) {
mvprintw(8,8,"NACISNIETO 6");
refresh();
}
stan=(void*) stanRzut;
return (void*) stan;
}
Niby wszystko działa, jednak problem polega na tym, że gdy pierwszy wątek realizuje odliczanie co 1/10 sekundy, przenoszony jest kursor w tamto miejsce. Jeżeli mam szczęście, to czasem program zarejestruje naciśnięty klawisz, jednak w większości przypadków to po prostu nie działa, bo kursor jest zaraz za cyframi stopera zamiast w miejscu scanfa. Można coś poradzić na to? Możliwe, że podział na wątki nie jest tu dobrym pomysłem i idzie to zrealizować inaczej; ja jestem dopiero początkującym programistą i to pierwsze co wpadło mi do głowy.
Pozdrawiam serdecznie!