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
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
A voir également:
- Problème avec la fonction sleep en C++
- Fonction si et - Guide
- Fonction moyenne excel - Guide
- Fonction filtre excel n'existe pas - Forum Excel
- Excel renvoyer la valeur d'une cellule en fonction d'une autre - Forum Logiciels
- Fonction somme excel - Guide
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
30 mai 2014 à 15:39
'lut, c'est parce que
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
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...
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...
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
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
à 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
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
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é.
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é.