[C++] Wykonywanie funkcji w tle

0

Witam. Otóż tworzę taki schematowy odtwarzacz muzyki (bez odtwarzania dźwięków) tylko po prostu taką zasadę działania, że odlicza się czas kawałka, po czym przełącza się następny itp. W związku z tym chciałbym zapytać czy jest możliwość wykonywania funkcji w tle? Mam funkcję odtwarzanie, która pobiera z jednej tablicy tytuł, zaś z drugiej czas tego utworu. Zmniejsza go do zera i gdy to nastąpi pobiera kolejny i tak w kółko. Jednakże stan tej funkcji chciałbym sprawdzać w innej. Poniżej kod:

#include <windows.h>
#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

class odtwarzacz
{
   int glosnosc,stan,numer,pozostalo,temp;   
   char utwor[50];
   
   public:
       void wysun();
       void odtwarzaj(int czas[], char utwory[9][70]);
       void poprzedni();
       void nastepny();
       void pauza();
       void stop();
       void podglos();
       void scisz();
       void parametry(int czas[], char utwory[9][70]);
       odtwarzacz(int u, bool p);
       odtwarzacz()
       {
         strncpy(utwor,"Brak",50);;
         glosnosc=0;
         stan=0;
         numer=0;
         pozostalo=0;
         temp=0;
       }
       
};

void odtwarzacz::wysun(){
   cout << "Wysuwanie tacki...\n";
   //mciSendString("Set CDAudio Door Open wait", 0, 0, 0);
   cout << "Tacka wysunieta, wloz plyte\n";
   Sleep(3000);
   cout << "Wsuwanie tacki...\n";
   //mciSendString("Set CDAudio Door Closed wait", 0, 0, 0);
   cout << "Tacka wsunieta, odtwarzanie plyty";
   Sleep(2000);
   if (stan==0) stan=1;
   else stan=0;
}

void odtwarzacz::stop(){
   if (stan==0) cout << "Brak plyty w odtwarzaczu";
   else
   {
   cout << "Odtwarzanie zatrzymane";
   strncpy(utwor,"Brak utworu",50);;
   glosnosc=0;
   }
   cin.ignore();
   getchar();
}
void odtwarzacz::odtwarzaj(int czas[], char utwory[9][70]){
   
   pozostalo=czas[numer];
   strncpy(utwor,utwory[numer],70);
   
   if (stan==0) cout << "Brak plyty w odtwarzaczu";
   else 
   {
    do
    {
    pozostalo--;
    if (pozostalo==0)
    {
     if (numer==9) numer=0;
     else 
     {
      numer+=1;
      strncpy(utwor,utwory[numer],70);
      pozostalo=czas[numer];
     }
    }
    }
    while(pozostalo>0);
   }
   cin.ignore();
   getchar();  
} 

void odtwarzacz::parametry(int czas[], char utwory[9][70]){
   if (stan==1) cout << "Stan: Plyta w srodku" << endl;
   else cout << "Stan: Brak plyty" << endl; 
   cout << "Utwor: " << utwor << endl;
   cout << "Glosnosc: " << glosnosc << "%" << endl;
   cout << "Pozostaly czas: " << pozostalo << endl;
   cin.ignore();
   getchar();
}
void odtwarzacz::podglos(){
   if (stan==0) cout << "Brak plyty w odtwarzaczu";
   else
   {
   if (glosnosc<100)
   {
    glosnosc+=10;
    cout << "Glosnosc: " << glosnosc << "%" << endl;
   }
   else if(glosnosc==100) cout << "Glosnosc max osiagnieta";
   }
   cin.ignore();
   getchar();
}
void odtwarzacz::scisz(){
   if (stan==0) cout << "Brak plyty w odtwarzaczu";
   else
   {
   if (glosnosc>0)
   {
    glosnosc-=10;
    cout << "Glosnosc: " << glosnosc << "%" << endl;
   }
   else if(glosnosc==0) cout << "Glosnosc min osiagnieta";
   }
   cin.ignore();
   getchar();
}

int main(){
  
   char utwory[9][70];
   strncpy(utwory[0],"Armin van Buuren feat. Susana - Desiderium 207",70);
   strncpy(utwory[1],"Armin van Buuren - Mirage",70);
   strncpy(utwory[2],"Armin van Buuren feat. Christian Burns - This Light Between Us",70);
   strncpy(utwory[3],"Armin van Buuren vs. Sophie Ellis Bextor - Not Giving Up On Love",70);
   strncpy(utwory[4],"Armin van Buuren - I Don't Own You ",70);
   strncpy(utwory[5],"Armin van Buuren - Full Focus",70);
   strncpy(utwory[6],"Armin van Buuren - Coming Home",70);
   strncpy(utwory[7],"Armin van Buuren - Orbion",70);
   strncpy(utwory[8],"Armin van Buuren vs. Ferry Corsten - Minack",70);
   strncpy(utwory[9],"Armin van Buuren - Youtopia",70); 
   int czas[9];
   czas[0]=138;
   czas[1]=250;
   czas[2]=192;
   czas[3]=385;
   czas[4]=324;
   czas[5]=453;
   czas[6]=523;
   czas[7]=231;
   czas[8]=232;
   czas[9]=232;
  
  odtwarzacz cd;
  int wybor;
  do{
  cout << "ODTWARZACZ MUZYKI\n" << endl;
  cout << "MENU:" << endl << endl;  
  cout << "1. Wysun/wsun tacke" << endl;
  cout << "2. Odtwarzaj" << endl;
  cout << "3. Poprzedni" << endl;
  cout << "4. Nastepny" << endl;
  cout << "5. Pauza" << endl;
  cout << "6. Stop" << endl;
  cout << "7. Podglos" << endl;
  cout << "8. Scisz" << endl;
  cout << "9. Parametry" << endl;
  cout << "10. Wylacz" << endl;
  
  cout << "Opcja: ";
  cin >> wybor;
  

switch (wybor)
{
    case 1 : cd.wysun();break;
    case 2 : cd.odtwarzaj(czas, utwory);break;
    /*case 3 : cd.poprzedni();break;
    case 4 : cd.nastepny();break;
    case 5 : cd.pauza();break;*/
    case 6 : cd.stop();break;
    case 7 : cd.podglos();break;
    case 8 : cd.scisz();break;
    case 9 : cd.parametry(czas, utwory);break;
    case 10 : break;    
}
system("cls");
}
while (wybor!=10);
  cin.ignore();
  getchar();
  return 0;
  
}
 

Z góry dziękuję za okazaną pomoc.

0

W aplikacjach konsolowych wszystko wykonywane jest linijka po linijce, więc nie ma takiej możliwości. Jeśli chcesz osiągnąć efekt wykonywania dwóch funkcji w tym samym czasie, musiałbyś pisać aplikację WinApi

0

Niestety to spowodowałoby chyba całkowitą zmianę mojego projektu. A co z tworzeniem nowych procesów? Bo ktoś mi wspominał o tym, lecz nie ogarniam tego.

0

"Armin van Buuren feat. Susana - Desiderium 207"
Nie ma to jak ambitna piosenka z rana..

0

No mógłbyś uruchamiać nowy proces, w którym wykonywała by się ta funkcja, ale to jest bardzo dużo zabawy. Musiałbyś sobie poczytać o pamięci współdzielonej (semafory) żeby w jakiś sposób przekazywać dane między programami (ew. zapisywać do pliku i odczytywać, choć to w tym przypadku akurat chyba odpada )

0

Blood no niestety to odpada. W zamyśle programu niestety nie przemyślałem tego i teraz mam za swoje.

Ambitny: To przykładowa tracklista wzięta z pierwszej lepszej płyty w google.

0

ale wiesz, wszystko da się zrobić inaczej :D Powiedz tylko co dokładnie potrzebujesz robić.

0

Potrzebuję zmniejszać czas pobrany z tablicy i jeżeli dojdzie do 0 to ma pobrać następny element z tablicy tj. z utwory i czas o tym samym indeksie. Następnie chce żebym mógł wyświetlić status tego zmniejszania i jaki utwór aktualnie jest w funkcji parametry.

0

Aha i Ty chciałeś, żeby jednocześnie w jednej funkcji zmniejszany był czas a w drugiej była symulacja odtwarzania muzyki?

0

Ta, chyba, że masz jakiś inny pomysł żeby to rozwiązać.

0

Skoro i tak muzyka nie będzie odtwarzana to według mnie można to pominąć. Jak będziesz pisał już realny odtwarzacz, w którym muzyka faktycznie będzie odtwarzana, to i tak będziesz musiał to zrobić w WinApi lub innym GUI i wtedy nie będzie problemu z wykonywaniem równolegle funkcji. Tak więc ja bym Ci po prostu proponował pominąć funkcję odtwarzania muzyki, a zostawić tylko opcję z czasem i wyświetlaniem obecnego utworu, a z tym nie ma już żadnego problemu.

0

Po prostu zrobić na stałe bez odliczania i samo następny, poprzedni. Tak?

0

Nom.

0

Ok, dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1