• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zakończenie oczekiwania na znak z klawiatury (?)

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
797 wizyt
pytanie zadane 21 stycznia 2018 w C i C++ przez Perseusz Bywalec (2,190 p.)
Mam takie pytanie czy jest jakiś sposób na pominięcie oczekiwania na znak z klawiatury? Tak żeby przejść do następnego kodu po określonym czasie gdy komputer nie otrzyma sygnału - wartość będzie domyślna.

Chodzi mi o to, żeby komputer gdy nie otrzyma w ciągu określonego czasu wartości dla funkcji getch() przeszedł dalej

1 odpowiedź

0 głosów
odpowiedź 21 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 21 stycznia 2018 przez Sebastian Fojcik

Możesz to zrealizować oddzielając wczytywanie znaków do innego wątku. Bo funkcja getch(); zawsze zatrzyma program (główny wątek) w oczekiwaniu na znak. Są jeszcze takie funkcje asynchroniczne z WinAPI, ale to trochę wyższa szkoła jazdy.

Może zamiast opisywać o co chodzi, pokażę przykład. Tak się chyba najszybciej nauczysz. Skompiluj go sobie i przetestuj. Wciskaj różne przyciski w trakcie działania :-)

#include <iostream>
#include <ctime> // clock
#include <thread> // thread
#include <conio.h> // getch

using namespace std;

void wczytuj()
{
    while( true ) // wczytuje w nieskończoność znaki
    {
        cout << "Wczytano: " << (char)getch() << endl;
    }
}

void wypisuj()
{
    clock_t start = clock();
    while( true )
    {
        double czas = (double)(clock() - start) / CLOCKS_PER_SEC;
        if( czas >= 1.0 ) // co sekundę wypisuje napis.
        {
            start = clock();
            cout << "Wypisuje napis..." << endl;
        }
    }
}

int main()
{
    thread wczytywanie( wczytuj ); // tworzy nowy wątek
    thread wypisywanie( wypisuj );
    wczytywanie.join();    // uruchamia wątek niezależnie od main
    wypisywanie.join();

    return 0;
}

Uwaga. Aby program się zakończył i wyłączył, wątki muszą skończyć pracę, czyli nieskończone pętle, które siedzą w funkcjach wczytuj i wypisuj muszą się kiedyś zakończyć. Użyj do tego break.

Pytaj jakbyś miał wątpliwości ;-)

PS. Wypisywanie tekstu co sekundę mogłem też napisać z użyciem Sleep tak:

#include <Windows.h>
// ...
while( true )
{
    cout << "Wypisuje napis..." << endl;
    Sleep( 1000 );
}

Ale jest to nieeleganckie, no i działa tylko na Windowsie (choć może Ci to latać koło ucha pewnie :-P)

komentarz 21 stycznia 2018 przez Perseusz Bywalec (2,190 p.)
W sumie to już powoli to ogarniam tylko mam drobne problemy z dobudowaniem tego do mojego programu. Pewnie zaczne go od początku bo jakoś ciężko mi to przychodzi. Jeszcze taka dygresja: rozumiem że double użyłeś tylko dlatego, że chodzi o po prostu duże liczby, no i o co chodzi z tym clock_t? Niby jakieś przesunięcie wskazówki zegara, czy coś ale nic mi to nie mówi.

No i oczywiście dzięki za pomoc! :) Brak nauczyciela lekko się udziela..
komentarz 21 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Funkcja clock() zwraca liczbę cykli procesora od uruchomienia programu, np. jeśli procesor ma 1 GHz, czyli 1 000 000 000 Hz, to znaczy, że właśnie tyle cykli wykonuje na sekundę. (Wiele programów działa równolegle, więc "dzielą się one procesorem" :-P)

clock() zwraca nie int, nie double, nie float, tylko typ, który się nazywa clock_t. ('t' od słowa "type"). Możesz sprawdzić jak u Ciebie kompilator zinterpretuje tę zmienną. U mnie w Visual Studio po najechaniu kursorem na clock_t otrzymuję takie okienko:

widać instrukcję typedef, co oznacza, że clock_t jest (u mnie) tym samym co zmienna typu long

Instrukcja, w której użyłem double to moment, w którym liczę czas, który upłynął od ustawienia zmiennej start. Rzutuję tę wartość na double nie dlatego, że to duża liczba, lecz wręcz przeciwnie. Dlatego, że potrzebuję bardzo dokładnej wartości (podwójnej precyzji). Przecież jeśli minie jedna milionowa sekundy, to ja tą wartość chcę zapisać do zmiennej czas, więc musi ona być double (dokładna).

Obejrzyj najlepiej odcinek kursu C++ Mirka, w którym on tłumaczy i używa tych funkcji clock() do obliczania czasu wykonania programu. 

komentarz 22 stycznia 2018 przez Perseusz Bywalec (2,190 p.)
Widać gdzieś mi ten odcinek uciekł, ale w miare mi to wytłumaczyłeś także jeszcze raz dzięki :D

Podobne pytania

0 głosów
1 odpowiedź 953 wizyt
pytanie zadane 13 sierpnia 2018 w C i C++ przez Ogleirduwa Nowicjusz (170 p.)
0 głosów
1 odpowiedź 296 wizyt
pytanie zadane 8 czerwca 2019 w C i C++ przez AuriattaDev Początkujący (390 p.)
0 głosów
1 odpowiedź 3,345 wizyt
pytanie zadane 16 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

93,103 zapytań

142,079 odpowiedzi

321,591 komentarzy

62,445 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...