Skocz do zawartości

G++ Problem Kbhit()


ViQiX

Rekomendowane odpowiedzi

Proste pytanie. Dość długo nie programowałem. Ostatnio w szkole. Używałem TP i DJGPP. W tym drugim było kbhit() i getch() więc z Pascala do C++ była prosta droga. Funkcje getch() już mam lecz kbhit() nie działa tak jak trzeba. W necie znalazłem coś takiego:

int kbhit(void)
{
   struct timeval tv;
   fd_set read_fd;

   tv.tv_sec=0;
   tv.tv_usec=0;
   FD_ZERO(&read_fd);
   FD_SET(0,&read_fd);

   if(select(1, &read_fd, NULL, NULL, &tv) == -1) return 0;

   if(FD_ISSET(0,&read_fd)) return 1;

   return 0;
}

Robię prosty programik, który coś tam oblicza. Zajmuje to dość dużo czasu i od czasu do czasu, potrzebuje wyświetlić wyniki. Niby proste.

...
main()
{
    char key;
    ...
    if(kbhit())key=getch();            //Potem definicja odpowiednich klawiszy
    ...
}

 

 

Proszę o wskazówki. Z góry dzięki.

Używam netbeans.

Odnośnik do komentarza
Udostępnij na innych stronach

Trochę mieszasz, ale postaram się pomóc na ile potrafię ;)

 

Po pierwsze do czego dokładnie potrzebna Ci obrzydliwa Bordlandowska funkcja kbhit()? Piszesz:

 

Robię prosty programik, który coś tam oblicza. Zajmuje to dość dużo czasu i od czasu do czasu, potrzebuje wyświetlić wyniki. Niby proste.

 

Mi na myśl przychodzi sygnał alarmowy (SIGALRM) oczywiście, ale nie wiem czy jest to rozwiązanie zadowalające dla początkujących i dość "nowoczesne"...

 

Możesz też próbować z kilkoma wątkami (wbrew pozorom łatwe i przyjemne rozwiązanie) aczkolwiek wchodzi tu oczywiście w grę większy narzut niż przy sygnałach i może być problem z operacjami blokującymi (często ostrzegają przed tym w starszych materiałach choć mi osobiście nie udało się nigdy uśpić całego procesu blokując wątek, ktoś wie coś więcej?)

 

Jeśli bardzo chcesz użyć rozwiązania z selectem to <link> wydaje się bardziej kompletne niż to co wkleiłeś...

Odnośnik do komentarza
Udostępnij na innych stronach

nie koniecznie kbhit()

Jest mi potrzebna funkcja, która sprawdza, czy naciśnięty jest klawisz. Gdy klawisz nie jest naciśnięty, to program działa dalej,a gdy naciśnięty, to odczytuje wartość klawisza. Program ma ułożyć dość skomplikowane puzzle "logiczne". Nie chce, by wyświetlał wynik cały czas, bo wiadomo, że niepotrzebnie zwolni jego działanie. W Pascalu mniej więcej tak.

Var
  Key:Char;

Begin
  Repeat
    If KeyPresseed Then Key:=ReadKey;
    {costam}
  until Key=#27;
End.

 

Przykład w Pascalu, bo nic nie chciałem namieszać. Potrzebna mi funkcja, która zastąpi Pascalowski KeyPressed.

Program w C, bo Pascal do tego za wolny. W pascalu już miałem i działało to trochę ociężale.

 

Odnośnik do komentarza
Udostępnij na innych stronach

W takim razie prawdopodobnie wystarczy funkcja z podanego przeze mnie w ostatnim poście linku:

 

#include <stdio.h>
#include <sys/types.h>
#include <termios.h>
#include <sys/ioctl.h>

int _kbhit() {
   static const int STDIN = 0;
   static bool initialized = false;
   int bytesWaiting;

   if (! initialized) {
       // Use termios to turn off line buffering
       termios term;
       tcgetattr(STDIN, &term);
       term.c_lflag &= ~ICANON;
       tcsetattr(STDIN, TCSANOW, &term);
       setbuf(stdin, NULL);
       initialized = true;
   }

   ioctl(STDIN, FIONREAD, &bytesWaiting);
   return bytesWaiting;
}

 

Zwróć uwagę na pliki nagłówkowe. Oryginalny kod dołączał plik stropts.h, który nie jest dostępny w Linuksie.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki śliczne. To dokładnie to co potrzebuje.

 

W takim razie prawdopodobnie wystarczy funkcja z podanego przeze mnie w ostatnim poście linku:

 

Nie zauważyłem linku w poprzednim poście. Gdybym zauważył, nie byłoby już problemu. Jeszcze raz dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...