Problème avec la fonction sleep en C++

Fermé
leberra Messages postés 27 Date d'inscription vendredi 30 mai 2014 Statut Membre Dernière intervention 25 décembre 2015 - 30 mai 2014 à 15:06
leberra Messages postés 27 Date d'inscription vendredi 30 mai 2014 Statut Membre Dernière intervention 25 décembre 2015 - 1 juin 2014 à 12:17
Bonjour,

je suis en train de créer un programme pour faire une playlist car mon lecteur media (final media player) ne me le permet pas. voici mon code :

#include <iostream>
#include <fstream>
#include <windows.h>
#include <unistd.h>
#include <string>

using namespace std;

int main()
{
string titre("");
int duree(0);
string const fichier("c:/Users/Admin/desktop/playlist.txt");
ofstream flux(fichier.c_str());
while (titre != "termine")
{
cout << endl << "titre et chemin d'acces du document a lire (entrer 'termine' si c'est fini). Il ne doivent pas comporter d'espace ni d'accent" << endl;
cin >> titre;
flux << titre << endl;
if (titre !="termine")
{
cout << "duree (en secondes) : ";
cin >> duree;
flux << duree << endl;
}
}
ifstream fluxMusique("c:/Users/Admin/desktop/playlist.txt");
string musique("");
while (musique != "termine")
{
fluxMusique.ignore();
getline(fluxMusique,musique);
cout << musique << endl;
if (musique != "termine")
{
const char *nom2 = musique.c_str ();
system(nom2);
fluxMusique >> duree;
unsigned temps(duree*1000);
cout << duree << endl;
Sleep(temps);
}
}
return 0;
}


j'utilise donc la fonction sleep pour que le programme ne lance pas toutes les musiques en même temps.

Le problème, c'est que, bien que la ligne "sleep(temps);" soit placée avant la ligne "system(nom2);", le programme commence par patienter avant de lancer la commande

quelqu'un aurait une solution pour que la musique se lance avant que le programme patiente ?

3 réponses

ElementW Messages postés 4814 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
30 mai 2014 à 15:39
'lut, c'est parce que
system()
n'est pas asynchrone: elle bloque l'exécution du programme jusqu'à ce que celui lancé soit terminé (complètement quitté).
En assumant que ton lecteur media se ferme tout seul, ton programme attendra la fin de la musique puis... attendra encore pendant le temps que tu lui auras spécifié.
S'il reste ouvert et qu'il change de musique quand on ouvre un fichier audio, comme VLC par exemple, c'est plus complexe: la première instance restera toujours ouverte (donc le
system()
ne finira pas), et les suivantes se "fermeront" immédiatement; elles auront fait changer de musique a la première instance.

Le hic ici, c'est que tu ouvres les musiques par leur association de fichier, donc on ne sait pas quel est ton lecteur, ni quels sont ses paramètres concernant l'ouverture...
0
leberra Messages postés 27 Date d'inscription vendredi 30 mai 2014 Statut Membre Dernière intervention 25 décembre 2015 1
Modifié par leberra le 30/05/2014 à 15:57
mon lecteur est comme VLC : il ne se ferme pas une fois la musique terminée, d'où la ligne sleep() qui permet de lancer la musique suivante à la fin de la précédente car sinon, il est impossible de détecter quand la musique finit

à bien y réfléchir, c'est en fait la ligne avec "system()" qui semble s'exécuter après tout le monde et non la ligne "sleep()" qui s'exécute avant.

Enfin, ce n'est pas les suivantes qui se ferment automatiquement mais la première qui semble ne jamais pouvoir se lancer, les autres se lancent une fois le temps d'attente de la première terminée
0
leberra Messages postés 27 Date d'inscription vendredi 30 mai 2014 Statut Membre Dernière intervention 25 décembre 2015 1
1 juin 2014 à 12:17
j'ai finalement opté pour l'utilisation de la bibliothèque FMOD Ex à la place de la fonction system() : j'ai bien galéré mais au final, je pilote directement la carte son, donc pas de problème de lecteur qui refuse de se fermer.
seul bémol : mon programme ne lit que les fichiers uniquement audio (wav, mp3 ...), ce qui exclut la lecture des fichiers mp4.
C'est dommage mais comme le but de mon programme est de faire une playlist, ce n'est pas un inconvénient majeur
prochaine étape : le rendre plus facilement utilisable, car je dois avouer que c'est un peu ch***t de rentrer tous les chemins d'accès absolus

si quelqu'un a une idée, voici mon code :

#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
#include "chrono.h"
#include <FMOD/fmod.h>

using namespace std;

int main()
{
FMOD_SYSTEM *chanson; // on alloue un système pour les sons
FMOD_System_Create(&chanson); //on le crée
FMOD_System_Init(chanson, 1, FMOD_INIT_NORMAL, NULL); //et on l'initialise
FMOD_CHANNEL *channel; //on crée un pointeur vers un canal audio
FMOD_SOUND *sound; //on crée un pointeur vers le son futur
string titre("");
int duree(0);
FMOD_BOOL lecture(FMOD_OK); //cette variable va servir pour vérifier que la lecture se passe sans problèmes
string const fichier("c:/Users/Admin/desktop/playlist.txt");
ofstream flux(fichier.c_str());
flux << endl;
string choix("");
while (choix !="oui" && choix != "non")
{
cout << "creer une playlist ? ";
cin >> choix;
}
const char*cheminDAcces2("");
if (choix == "oui")
{
while (titre != "termine")
{
cout << endl << "titre et chemin d'acces du document a lire (entrer 'termine' si c'est fini). Il ne doivent pas comporter d'espace ni d'accent" << endl; // ben ouais car les accents sont remplacés par des caractères bizarres dans le fichier txt
cin >> titre;
flux << titre << endl;
if (titre != "termine") //on entre la duree en secondes, ce qui nécessite un calcul mental
{
cout << "duree (en secondes) : ";
cin >> duree;
flux << duree << endl;
}
}
cheminDAcces2 = "c:/Users/Admin/Desktop/playlist.txt";
}
else
{

string cheminDAcces("");
cout << "chemin d'acces : ";
cin >> cheminDAcces;
cheminDAcces2 = cheminDAcces.c_str ();
}
ifstream fluxMusique(cheminDAcces2);
string musique("");
while (musique != "termine")
{
if (fluxMusique)
{
fluxMusique.ignore();
getline(fluxMusique,musique);
cout << musique << endl;
if (musique != "termine")
{
const char *nom2 = musique.c_str ();
lecture = FMOD_System_CreateSound(chanson, nom2, FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM, 0, &sound); //chargement du son
if (lecture != FMOD_OK) //vérification que ça s'est bien passé
{
cout << "rate" << endl;
}
else
{
cout << "lance" << endl;
}
FMOD_System_PlaySound(chanson, FMOD_CHANNEL_FREE, sound, 0, &channel); //on lance la lecture
}
if (musique != "termine")
{
fluxMusique >> duree;
chronometre(duree); //et on poiraute
FMOD_Sound_Release(sound); //avant de l'arrêter
}
}
}
FMOD_System_Close(chanson); //on ferme les objets proprement
FMOD_System_Release(chanson); //c'est plus prudent
return 0;
}

note : la fonction chronomètre a le même effet que la fonction sleep() : elle fait patienter jusqu'à l'écoulement du temps donné par l'argument. voici son code :

void chronometre(int temps)
{
clock_t arrivee=clock()+(temps*CLOCKS_PER_SEC); // On calcule le moment où l'attente devra s'arrêter
while(clock()<arrivee);
}

Est-ce mieux d'utiliser la fonction sleep() ? Perso, j'ai pas testé.
0