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

Co można tu poprawić? Zastępstwo dla Sleep

Object Storage Arubacloud
0 głosów
213 wizyt
pytanie zadane 26 marca 2017 w C i C++ przez Marchewka900 Bywalec (2,970 p.)
edycja 30 września 2020 przez Marchewka900

Ostatnio stworzyłam funkcję tworzącą animację "pisania" tekstu w konsoli.

void ani(string line, char color)
{
	switch(color)
	{
		case '1': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1);  break;
		case '2': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);  break;
		case '3': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);  break;
		case '4': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);  break;
		case '5': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 5);  break;
		case '6': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 6);  break;
		case '7': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);  break;
		case '8': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 8);  break;
		case '9': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 9);  break;
		case 'a': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10); break;
		case 'b': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11); break;
		case 'c': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); break;
		case 'd': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 13); break;
		case 'e': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14); break;
		case 'f': SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); break;
	}

	int nr = line.size();

	for (int i = 0; i <= nr; i++)
	{
		cout << line[i];
		Sleep(100);
	}

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}

Dodatkowo funkcja zmienia kolor w palecie 1-f (łatwiej mi je zapamiętać niż to 1-15).
A potem pomyślałam o tej nieszczęsnej multi-platformowości. Gdybym zrobiła fajną grę używając tej funkcji, przez to Sleep(100) gra nie działałaby na innych platformach niż windows. Jest jakiś zamiennik?

A poza tym, co można by tu jeszcze zmienić?

komentarz 26 marca 2017 przez QizmoPL Stary wyjadacz (11,440 p.)
mozesz uspac watek

3 odpowiedzi

+2 głosów
odpowiedź 26 marca 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 26 marca 2017 przez Marchewka900
 
Najlepsza

1) Co do uśpienia z poziomu programu. Jak napisali poprzednicy, uśpij wątek. Jeśli z różnych powodów nie możesz (np. stary kompilator choć dziś już trzeba mówić "antyczny"..), pod MS Windows użyjesz Sleep(...) z nagłówkiem <windows.h> a pod GNU/Linux/Unix, sleep() z nagłówka <unistd.h>. Detekcję systemu wykonasz z użyciem #ifdef. Symbole detekcji systemu to (nie będę wymieniał wszystkich ale te popularne):

  • _WIN32 - 32-bitowe MS WIndows
  • _WIN64 - 64-bitowe MS Windows
  • __APPLE__ - systemy z "jabłkiem"
  • __linux__ - GNU/Linux
  • __unix__ - inne Unix'y

2) Jeszcze inną metodą na uśpienie jest niepolecane użycie std::system(...). Tu rzecz polega na wywołaniu polecenia: "sleep X" dla systemów Unix'o podobnych oraz trikowe: "ping 127.0.0.1 -n 4 > nul" gdzie wartość po "-n", to ilość sekund.

3) Następny problem to kolory. Dawniej było tak że MS Windows zawierał sterownik konsoli ANSII.SYS aby upodabniać obsługę kolorów do tej dostępnej w terminalach VT100. Niestety, nie ma już tego :-/ Stąd też pozostaje 1 sposób i wydzielenie kodu natywnego dla systemów.

Który polecam? Oczywiście 1 jeśli chodzi o zagadnienie właściwych dla systemu operacji (czyli detekcja przez makra) oraz uśpienie z użyciem uśpienia w wątku.

PS. Co do tego brzydkiego swiych/case... Napisz to z użyciem jakiejś nawet tablicy. Bo to co widać to.. lepiej nie mówić.

0 głosów
odpowiedź 26 marca 2017 przez draghan VIP (106,230 p.)

http://en.cppreference.com/w/cpp/thread/sleep_for

Sleep nie jest największym problemem: przecież używasz funkcji WinApi do zmiany koloru tekstu. :) Plus nie wykonujesz na strumieniu wyjścia flush, co może odbić się czasem czkawką (w postaci niewyświetlenia tekstu przez pewien czas i pojawieniu się całości naraz).

0 głosów
odpowiedź 26 marca 2017 przez MararOn Bywalec (2,620 p.)

Dla standardu c++11 i wyżej możesz użyć czegoś takiego:

#include <chrono>
#include <thread>
...
std::this_thread::sleep_for(std::chrono::milliseconds(ms));

 

1
komentarz 26 marca 2017 przez adrian17 Ekspert (344,860 p.)

A z 14 nawet
 

std::this_thread::sleep_for(20ms);

 

Podobne pytania

0 głosów
1 odpowiedź 1,317 wizyt
0 głosów
3 odpowiedzi 675 wizyt
pytanie zadane 8 lipca 2015 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 574 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...