#include <curses.h> /* stdio.h jest w curses.h */ #include <pthread.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define sekunda 1000000 typedef struct { int czas; int stan; char * liczba; pthread_t watek1; /* Tworze zmienne, nie wskazniki */ pthread_t watek2; } daneWatkow; void *stoper(void *dane); void *wpisz(void *dane); int main() { char tempLiczba[15]; daneWatkow *daneMain; daneMain=(daneWatkow*) malloc(sizeof(daneWatkow)); daneMain->stan = -1; initscr(); cbreak(); mvprintw(1,1,"Podaj wartosc stopera: "); scanw("%d", &daneMain->czas); mvprintw(2,1,"Podaj liczbe: "); scanw("%s", &tempLiczba); daneMain->liczba = (char*) malloc(strlen(tempLiczba) + 1); strcpy(daneMain->liczba, tempLiczba); pthread_create(&daneMain->watek1, NULL, stoper, (void*) daneMain); /* Panietaj o adresie! Składnia: adres watka, parametry, wykonywana funkcja, przekazywany parametr*/ clear(); pthread_create(&daneMain->watek2, NULL, wpisz, (void*) daneMain); /* Jako parametr przekazuje cala strukture daneMain jako typ void*, jest to wymagane */ /* tu wykonuja sie watki, kod idzie dalej dopiero jak sie zakoncza*/ pthread_join(daneMain->watek1, NULL); /* tu nie ma adresu */ pthread_join(daneMain->watek2, NULL); clear(); if (daneMain->stan == 0) { mvprintw(4,4,"PRZEGRANA:\("); refresh(); getch(); } if (daneMain->stan == 1) { mvprintw(4,4,"WYGRANA:\)"); refresh(); getch(); } endwin(); free(daneMain->liczba); free(daneMain); return 0; } void *stoper(void *dane) { int i; daneWatkow *daneRzut; daneRzut=(daneWatkow*) dane; /* Trzeba zrzutowac parametr z typu void* na ten typ, ktory byl wczesniej */ clear(); for (i=0; i<=10*(daneRzut->czas); i++) { mvprintw(2,1,"%.1f",(daneRzut->czas)-i*0.1); /* z jednym miejscem po przecinku */ clrtoeol(); /* czysci do konca linii */ move(9,9); refresh(); usleep(sekunda/10); move(9,9); } daneRzut->stan = 0; pthread_cancel(daneRzut->watek2); return (void*) daneRzut; } void *wpisz(void *dane) { daneWatkow *daneRzut; char cyfra, cyfra2[2]; /* cyfra2 jest tablica, czyli typem char* a cyfra jest char i strcmp nie potrafi ich porownac */ cyfra='1'; daneRzut=(daneWatkow*) dane; while (cyfra!='0') { usleep(sekunda/10); move(9,9); if (cyfra = getch()) { cyfra2[0] = cyfra; cyfra2[1] = '\0'; if (strcmp(cyfra2, daneRzut->liczba)==0) { pthread_cancel(daneRzut->watek1); daneRzut->stan = 1; break; } mvprintw(8,8,"You typed, while in game: %c!", cyfra); move(9,10); clrtobot(); move(9,9); refresh(); } } return (void*) daneRzut; }