Trädvy Permalänk
Medlem
Registrerad
Jan 2017

C++ Bakomliggande loop

Hej,
Hur ordnar man en bakomliggande loop som körs medan resten av programmet körs? Exempelvis en ljudslinga som spelas upp medan programmet körs. I mitt fall vill jag ha en rubrik på en meny som skiftar färg, medan resten av menyraderna är i en och samma färg. Kör man koden nu visas bara första rubriken. Den andra texten ligger utanför loopen som är ändlös.

#include<iostream> #include<cstdlib> //bib för rand #include<ctime> # include <windows.h> //Möjliggör färg på text using namespace std; int main() { while(true) { system ( "color 03" ); Sleep ( 200 ); system ( "color 07" ); Sleep ( 200 ); system ( "color 08" ); Sleep ( 200 ); system ( "color 09" ); Sleep ( 200 ); system( "color 0A" ); Sleep( 200 ); system( "color 0B" ); Sleep( 200 ); system( "color 0C" ); Sleep( 200 ); system( "color 0D" ); Sleep( 200 ); system( "color 0E" ); Sleep( 200 ); system( "color 0F" ); Sleep( 200 ); system ( "cls" ); cout << "\n\n\t\t\t\t-=MIN ARCADE=-\n"; } system ( "color 3" ); Sleep (1); //Hur länge färg ska visas i ms cout << "\t\t\t\t[K]asta Mynt\n"; cout << "\t\t\t\t[B]ank\n"; cout << "\t\t\t\t[G]issa Tal\n"; cout << "\t\t\t\t[M]easure of Temperature\n"; cout << "\t\t\t\t[T]roll Assassin\n"; cout << "\t\t\t\t[A]vsluta\n"; char menyval; cin >> menyval; return 0; }

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Ditt program består normalt av en tråd, d.v.s. din kod i main kommer att köras uppifrån och ned i tur och ordning. Sleep säger åt operativsystemet att inte köra din tråd under en viss tid, vilket gör Sleep till en blockerande funktion (d.v.s. den blockerar din tråd från att göra något under den angivna tiden). Om man vill utföra flera saker samtidigt så måste man skapa flera trådar, t.ex. med std::thread.

Men att skapa flera trådar kommer inte hjälpa dig i detta fall, för du har nog missförstått hur utskrifter fungerar. Om du skulle flytta din loop till en egen tråd så skulle din meny skrivas ut, och sen skulle en ny "rubrik" skrivas ut varje 200ms (eller vilken tidsenhet nu Sleep använder). Om du bara låter den tråden köra så kommer den dessutom skriva ut denna text oavsett om din huvudtråd håller på att skriva ut något annat, eller om användaren håller på att mata in något, etc.

Så du kan för det första inte ändra färgen på din rubrik genom att använda cout, cout kommer bara skriva ut ny text efter den gamla texten. Du behöver något sätt att manipulera terminalen för att det ska gå att byta färg på redan existerande text. Kanske något som PDCurses skulle fungera.

Om du sedan har ett sätt att manipulera terminalen så behöver du inte flera trådar, då är det bättre att bara ha en oändligt loop och mäta hur lång tid som förflutit istället för att använda en blockerande Sleep.

Om du är intresserad av att skapa spel så är det nog mycket mer givande att bara gå direkt till riktig grafik istället, t.ex. genom att använda SDL.