• 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

VPS Starter Arubacloud
0 głosów
244 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 (156,260 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 (349,420 p.)

A z 14 nawet
 

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

 

Podobne pytania

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

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

62,350 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 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...