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

question-closed [C++] Zatrzymanie pętli poprzez przycisk z klawiatury.

Object Storage Arubacloud
0 głosów
745 wizyt
pytanie zadane 24 kwietnia 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
zamknięte 25 kwietnia 2019 przez Teslum_369

Witam,

Chciałbym zatrzymać taką pętlę w dowolnym momencie -> wtedy gdy użytkownik wciśnie jakiś klawisz. Wiem, że trzeba pobrać znak od użytkownika, lecz chciałbym zrobić tak, że wtedy gdy nic nie wciska na klawiaturze to "lecą sobie liczby" na ekranie.

Przedstawiam kod:

#include <iostream>
#include <conio.h>
#include <windows.h>



int main()
{
	int i{};
    int gc{};
	while(true)
	{
		std::cout << i <<"\n";
		Sleep(1000/3);
		i++;
	}
}

Jak można zauważyć, dodałem bibliotekę <conio.h> do użycia getch() (ogólnie to można chyba to zrobić też zwykłym getchar()). Wcześniej próbowałem coś wykombinować w taki sposób:

#include <iostream>
#include <conio.h>
#include <windows.h>



int main()
{
	int i{};
	int dc{};
	bool pierwszy_raz = true;
	while(dc = getch())
	{
		if(pierwszy_raz == true)
		{
			std::cin.ignore();
			pierwszy_raz = false;
		}
		if(dc == 27)break;
		
		std::cout << i <<"\n";
		Sleep(1000/3);
		i++;
	}
	
	std::cout << "\n\nPętla zakonczona!";
}

W powyższym kodzie moja logika była taka: w warunku pętli pobieraj znak, ale jeśli jest to pierwszy to go zignoruj, potem niech lecą te liczby, i jeśli w dowolnym momencie user klinie przycisk (w tym przypadku jest to "Esc") to wyjdź z pętli. 

Myślałem nad kilkoma innymi rozwiązaniami jednakże takie taktyki zawiodły, co więc mógłbym zrobić?

Z góry dziękuję!

komentarz zamknięcia: Problem rozwiązany przez autora

3 odpowiedzi

+1 głos
odpowiedź 24 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)
#include <conio.h>

int main()
{
    bool Run = true;
    char znak;
    while( Run )
    {
        znak = getch();
        if( znak == 'a' ) Run = false;
       
    }
    return 0;
}

Coś takiego? Nie jestem pewien, czy można odpalić "getch()" w tle.

komentarz 24 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)
Znaczy, bo ja miałem na myśli to, że podczas gdy user nie wciska nic to, żeby liczby się "same" wyświetlały - czyli np wyświetlać, a potem inkrementować. Nie wiem jak to wprowadzić.
komentarz 24 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)
W aplikacjach konsolowych wszystko wykonywane jest linijka po linijce, więc chyba nie ma takiej możliwości. Bo taki efekt wymagałby działania funkcji "getch" w tle, która czuwałaby nad tym, czy przypadkiem czegoś nie nacisnąłeś. Myślę, że to już bardziej WinAPI.
komentarz 24 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)
Słyszałem kiedyś o wątkach thread, że chyba coś takiego mogą, ale nie wiem kompletnie jak się to używa, może Ty wiesz coś o tym?
komentarz 24 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)
Nie bardzo.
0 głosów
odpowiedź 24 kwietnia 2019 przez Secrus Nałogowiec (32,880 p.)
Tutaj musiałbyś chyba zastosować wielowątkowość. Jeden wątek wyświetla tekst, a na drugim nasłuchujesz na zdarzenie kliknięcia klawisza
0 głosów
odpowiedź 25 kwietnia 2019 przez Teslum_369 Gaduła (4,190 p.)

o 4 w nocy udało mi się napisać rozwiązanie xD.

Jeśli ktoś zmagałby się z tym w przyszłości to umieszczam kod ilustrujący całą tą logikę:

#include <iostream>
#include <thread>
#include <windows.h>
#include <conio.h>


int poz{};
int tobar{};

gotoxy(int x, int y)
{
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void foo(int i)
{
	gotoxy(poz, 1);

	while(i<10)
	{
	std::cout << i;
	Sleep(1000/3);
	poz++;
	}
}
void bar(int i)
{
	int dc;
	while( dc = getch())
	{
	
	gotoxy(tobar, 3);
	
	std::cout << "#";
	gotoxy(poz+1, 1);
	
	
	tobar++;
	}
}

int main()
{


	for(int i{}; i<100; i++)
	{
		
		std::thread t1(foo,0);
		std::thread t2(bar,tobar);

		
		t1.join();
		t2.join();
		
		
	}
}

 

Podobne pytania

0 głosów
3 odpowiedzi 418 wizyt
pytanie zadane 10 lipca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
0 odpowiedzi 104 wizyt
pytanie zadane 1 października 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
+1 głos
1 odpowiedź 661 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 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!

...