• 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 (?)

Object Storage Arubacloud
0 głosów
708 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ź 799 wizyt
pytanie zadane 13 sierpnia 2018 w C i C++ przez Ogleirduwa Nowicjusz (170 p.)
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 8 czerwca 2019 w C i C++ przez AuriattaDev Początkujący (390 p.)
0 głosów
1 odpowiedź 3,040 wizyt
pytanie zadane 16 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...