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)