Monitoring de programme, crash
Re: Monitoring de programme, crash
Je ne laisserai pas le lien longtemps.
Re: Monitoring de programme, crash
Désormais notre logiciel de lecture webradio utilise fmod. Merci à vous tous pour toute l'aide apportée à son intégration.
Pour récapituler, le logiciel lit des fichiers .ogg à la manière d'une playliste. Il communique des informations au site internet de la radio, renseigne des bases de données pour la traçabilité. Tout serait vraiment bien, si de manière aléatoire un fichier sonore ne refusait pas de se lancer. Quelque soit la taille du fichier. J'ai relu et encore relu mon code, vérifié les libérations de fichier et c'est moi qui tourne en boucle. Je ne trouve pas le soucis. Ce n'est jamais le même fichier. J'ai testé sur un autre ordinateur, uniquement mon programme sans autre logiciel qui tourne et c'est idem.
Le programme doit fonctionner 24h/24 et 7j/7. Aujourd'hui lorsqu'il se plante il est automatiquement relancé et continu au morceau de musique suivant. (La relance prend 1 minute).
Cette fois je n'utilise plus la librairie Sound de purebasic et j'ai finalement le même soucis. Peut -être que je ne laisse pas à windows et son système multitâche assez de liberté de 'delay' ?
Je précharge le morceau suivant 30 secondes avant la fin de celui qui est en cours de lecture. Est-ce cela le problème ? J'ai réalisé cette opération car je pensais que le fichier n'étais pas joué parce qu'il n'avait peut être pas le temps d'être correctement chargé. Du coup comme je ne peux pas stopper la lecture (du son doit être toujours joué sur l'antenne), lors du préchargement je n'utilise pas de 'delay'.
il est a noter que le programme n'utilise pas de thread. Vu que çà plante déjà je n'ai pas voulu utiliser cette méthode pour le préchargement.
Pourriez vous juste regarder déjà si ma boucle principale est correcte ? Avec le WaitWindowEvent ?
C'est peut être normal qu'a un moment çà ne fonctionne pas dans une optique de lecture de fichiers continue ?
Merci.
Pour récapituler, le logiciel lit des fichiers .ogg à la manière d'une playliste. Il communique des informations au site internet de la radio, renseigne des bases de données pour la traçabilité. Tout serait vraiment bien, si de manière aléatoire un fichier sonore ne refusait pas de se lancer. Quelque soit la taille du fichier. J'ai relu et encore relu mon code, vérifié les libérations de fichier et c'est moi qui tourne en boucle. Je ne trouve pas le soucis. Ce n'est jamais le même fichier. J'ai testé sur un autre ordinateur, uniquement mon programme sans autre logiciel qui tourne et c'est idem.
Le programme doit fonctionner 24h/24 et 7j/7. Aujourd'hui lorsqu'il se plante il est automatiquement relancé et continu au morceau de musique suivant. (La relance prend 1 minute).
Cette fois je n'utilise plus la librairie Sound de purebasic et j'ai finalement le même soucis. Peut -être que je ne laisse pas à windows et son système multitâche assez de liberté de 'delay' ?
Je précharge le morceau suivant 30 secondes avant la fin de celui qui est en cours de lecture. Est-ce cela le problème ? J'ai réalisé cette opération car je pensais que le fichier n'étais pas joué parce qu'il n'avait peut être pas le temps d'être correctement chargé. Du coup comme je ne peux pas stopper la lecture (du son doit être toujours joué sur l'antenne), lors du préchargement je n'utilise pas de 'delay'.
il est a noter que le programme n'utilise pas de thread. Vu que çà plante déjà je n'ai pas voulu utiliser cette méthode pour le préchargement.
Pourriez vous juste regarder déjà si ma boucle principale est correcte ? Avec le WaitWindowEvent ?
C'est peut être normal qu'a un moment çà ne fonctionne pas dans une optique de lecture de fichiers continue ?
Code : Tout sélectionner
InitNetwork()
UseSQLiteDatabase()
Initialiser()
Initialiser_preferences()
OpenWindow_principale(gPosWindowX,gPosWindowY)
SetWindowTitle (Window_principale, "Programmation Radio Les Floralies " + #VERSION)
AddWindowTimer(Window_principale, #TIMER00, 5) ; 5 millisecondes boucle de traitements
AddWindowTimer(Window_principale, #TIMER01, 1000) ; 1 secondes ' seconde affichage
AddWindowTimer(Window_principale, #TIMER02, 1000 * 5) ; 5 secondes
AddWindowTimer(Window_principale, #TIMER03, 1000 * 30) ; 30 secondes
AddWindowTimer(Window_principale, #TIMER04, 1000 * 10) ; 10 secondes
AddWindowTimer(Window_principale, #TIMER05, 60) ; 60 milisecondes
Initialiser_suite()
Initialiser_canvas_principal()
BddTrace_Initialiser_base()
FMod_Initialiser()
Ajouter_au_log ("Démarrage du programme...", #LOG_DEMARRAGE)
Afficher_message (#ACCUEIL)
If gbLancerFichierAuDemarrage = #True
gTemps_lancement_fichier_demarrage = ElapsedMilliseconds()
Ajouter_au_log ("Démarrage auto du fichier de programmation par défaut dans " + #TEMPS_DEMARRAGE_AUTO + " secondes / bouton STOP pour annuler ...", #LOG_DEMARRAGE)
Afficher_message ("Démarrage auto du fichier de programmation par défaut dans " + #TEMPS_DEMARRAGE_AUTO + " secondes / bouton STOP pour annuler ...")
EndIf
AddKeyboardShortcut (Window_principale, #PB_Shortcut_Control|#PB_Shortcut_D, 1)
AddKeyboardShortcut (Window_principale, #PB_Shortcut_Control|#PB_Shortcut_T, 2)
Global Event
Repeat
Event = WaitWindowEvent(#TEMPS_BOUCLE_EVENTS_MS) ; avec #TEMPS_BOUCLE_EVENTS_MS = 20
Select Event
Case 0 ; plus d'événement en cours : zone pour le multitache
SetGadgetText(Text_multitache, "Coordonnées : " + Str(DesktopMouseX()) + "," + Str(DesktopMouseY()))
Case #PB_Event_Menu
Select EventMenu()
Case 1
Ouvrir_fenetre_direct_manuel()
Case 2
Terminer_direct_manuel()
EndSelect
Case #PB_Event_CloseWindow
gFini = Quitter()
Case #PB_Event_Gadget ; on a reçu un message en provenance d'un gadget PureBasic
Select EventGadget()
Case Checkbox_verrouiller_interface
If GetGadgetState (Checkbox_verrouiller_interface) = #PB_Checkbox_Checked
Verrouiller_interface()
Else
Deverrouiller_interface()
EndIf
Case Checkbox_remplir_direct_programme
If GetGadgetState (Checkbox_remplir_direct_programme) = #PB_Checkbox_Checked
gbRemplirCageDirect = #True
Else
gbRemplirCageDirect = #False
EndIf
Case Button_jouer
If gEtat_lecture = #LECTURE_LISTE_OFF
Changer_etat_lecture(#LECTURE_LISTE_INIT)
Else
MessageRequester("ERREUR", "La playlist est déjà en cours de lecture !", 0)
EndIf
Case Checkbox_affichage_onde
If GetGadgetState (Checkbox_affichage_onde) = #PB_Checkbox_Checked
gbAfficherOnde = #True
Else
Dessiner_cadre_vide()
gbAfficherOnde = #False
EndIf
Case Button_nouveau
Creer_nouvelle_programmation()
Case Button_charger
Charger_programmation()
Case Button_sauvegarder
Sauvegarder_programmation()
Case Button_passer
Forcer_passage_element_suivant()
Case Button_pause
Basculer_pause()
Case Button_stop
Envoyer_infos_site_arret_webradio()
Arreter_son()
...
Case Button_generer_programme
Envoyer_infos_site_lancement_webradio()
SetGadgetState (Checkbox_generer_programme_automatique, #PB_Checkbox_Checked)
Generer_programme(0, #False)
Case Button_requete_charger
Requete_charger()
Case Button_requete_sauver
Requete_sauver()
EndSelect
Case #PB_Event_Timer
Select EventTimer()
Case #TIMER00
FMOD_update()
If gEtat_lecture <> #LECTURE_LISTE_OFF
If gEtat_lecture <> #LECTURE_LISTE_INIT
Determiner_changement_jour()
EndIf
EndIf
If gPauseLecture = #False
If FMOD_EtreSon (@gSonLu) = #True
If FMOD_Determiner_EstArrete (@gSonLu) = #False ;par choix ne déclenche pas une interruption si aucun son n'est lu ou en pause
Gerer_declenchement_interruption()
EndIf
EndIf
EndIf
Select gEtat_lecture
Case #LECTURE_INTERRUPTION_DEBUT
Jouer_interruption()
Case #LECTURE_INTERRUPTION_ENCOURS
Gerer_lecture_interruption()
Case #LECTURE_INTERRUPTION_FIN
Terminer_lecture_interruption()
If gbChangerDeJourEnsuite = #True
gbChangerDeJourEnsuite = #False
Changer_etat_lecture (#LECTURE_CHANGEMENT_JOUR)
EndIf
Case #LECTURE_LISTE_OFF
; rien
Case #LECTURE_CHANGEMENT_JOUR
Ajouter_au_log ("Changement de jour.", #LOG_DEMARRAGE)
Arreter_son()
Initialiser()
Initialiser_suite()
gbLancerFichierAuDemarrage = #False
Charger_liste(#False)
Charger_interruption()
gItem_lecture = 0
Initier_lecture_liste()
PreCharger_et_jouer_element_liste(gItem_lecture)
Case #LECTURE_LISTE_FORCER_LECTURE_ELEMENT
Forcer_lecture_element_playliste()
Case #LECTURE_LISTE_ON
Passer_element_lecture_suivant()
Case #LECTURE_LISTE_INIT
If GetGadgetState (Checkbox_commencer_lecture_playliste_debut) = #PB_Checkbox_Checked
Charger_liste(#False)
gItem_lecture = 0
Else
If gbRepriseEtatRealisee = #False
Recuperer_dernier_etat()
Charger_liste(#True)
If Etat\Jour = Str(Day(Date()))
gItem_lecture = Val (Etat\Id_dernier_lu)
Else
gItem_lecture = 0
EndIf
gbRepriseEtatRealisee = #True
Else
Charger_liste(#False)
gItem_lecture = 0
EndIf
EndIf
Charger_interruption()
Initier_lecture_liste()
PreCharger_et_jouer_element_liste(gItem_lecture)
Case #LECTURE_LISTE_ITEM_PRET
If Tableau_elements(gItem_lecture)\bMultiFichiers = #False
Jouer_element_liste_charge(gItem_lecture+1)
Else
Jouer_element_liste_charge(gItem_lecture) ; correction juste pour afficher le titre du bon fichier actuellement lu.
EndIf
Changer_etat_lecture(#LECTURE_LISTE_ITEM_EN_COURS)
If Tableau_elements(gItem_lecture)\bMultiFichiers = #False
Passer_element_lecture_suivant()
Else
If Tableau_elements(gItem_lecture)\NumFic = 4
Passer_element_lecture_suivant()
EndIf
; ne change pas d'index si multifichier !
EndIf
Case #LECTURE_LISTE_ITEM_SUIVANT
Passer_element_lecture_suivant()
Case #LECTURE_LISTE_ITEM_EN_COURS
If gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
gbItem_lecture_presque_finie = Determiner_lecture_element_liste_presque_finie()
If gbItem_lecture_presque_finie = #True
gIndex_trouve = Donner_index_element_suivant(gItem_lecture)
If gIndex_trouve <> -1
If Tableau_elements (gIndex_trouve)\Titre <> "<DIRECT>"
gbRetourPrechargement = PreCharger_element_liste(gIndex_trouve)
Select gbRetourPrechargement
Case #LECTURE_LISTE_ITEM_CHARGEMENT_OK
; rien
Case #LECTURE_LISTE_ITEM_CHARGEMENT_MAX_ERREURS
Ecrire_dernier_etat (gFichierPlayliste$, Tableau_elements(gIndex_trouve)\Code, Tableau_elements(gIndex_trouve)\Id, #True, Tableau_elements(gIndex_trouve)\NbRotations)
Terminer_programme_erreur()
Case #LECTURE_LISTE_ITEM_CHARGEMENT_TENTER_ELEMENT_SUIVANT
Changer_etat_lecture(#LECTURE_LISTE_ITEM_SUIVANT)
EndSelect
Else
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_C_EST_UN_DIRECT
EndIf
Else ;
gbRetourPrechargement = #LECTURE_LISTE_ITEM_FINDELISTE
EndIf
EndIf
EndIf
If Determiner_lecture_element_finie() = #True
If gEtat_lecture <> #LECTURE_LISTE_FORCER_LECTURE_ELEMENT_SUIVANT
Select gbRetourPrechargement
Case #LECTURE_LISTE_ITEM_CHARGEMENT_C_EST_UN_DIRECT
Changer_etat_lecture(#LECTURE_CAGE_DIRECT_DEBUT)
Case #LECTURE_LISTE_ITEM_FINDELISTE
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_BOUCLER)
Default
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_ITEM_PRET)
EndSelect
EndIf
EndIf
Case #LECTURE_LISTE_FORCER_LECTURE_ELEMENT_SUIVANT
gIndex_trouve = Donner_index_element_suivant(gItem_lecture)
; gIndex_trouve = Donner_index_element_suivant(gItem_lecture) ; doublon de ligne = bug ou volontaire ?
If gIndex_trouve <> -1
If Tableau_elements (gIndex_trouve)\Titre <> "<DIRECT>"
gbRetourPrechargement = PreCharger_element_liste(gIndex_trouve)
Select gbRetourPrechargement
Case #LECTURE_LISTE_ITEM_CHARGEMENT_OK
; rien
Case #LECTURE_LISTE_ITEM_CHARGEMENT_MAX_ERREURS
Ecrire_dernier_etat (gFichierPlayliste$, Tableau_elements(gIndex_trouve)\Code, Tableau_elements(gIndex_trouve)\Id, #True, Tableau_elements(gIndex_trouve)\NbRotations)
Terminer_programme_erreur()
Case #LECTURE_LISTE_ITEM_CHARGEMENT_TENTER_ELEMENT_SUIVANT
Changer_etat_lecture(#LECTURE_LISTE_ITEM_SUIVANT)
EndSelect
Else
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_C_EST_UN_DIRECT
EndIf
Else ;
gbRetourPrechargement = #LECTURE_LISTE_ITEM_FINDELISTE
EndIf
Select gbRetourPrechargement
Case #LECTURE_LISTE_ITEM_CHARGEMENT_C_EST_UN_DIRECT
Changer_etat_lecture(#LECTURE_CAGE_DIRECT_DEBUT)
Case #LECTURE_LISTE_ITEM_FINDELISTE
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_BOUCLER)
Default
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_ITEM_PRET)
EndSelect
Case #LECTURE_LISTE_ITEM_FINIE
Passer_element_lecture_suivant()
Case #LECTURE_LISTE_TERMINEE
Terminer_lecture_liste()
Case #LECTURE_LISTE_BOUCLER
Boucler_lecture_liste()
Case #LECTURE_CAGE_DIRECT_DEBUT
Debuter_cage_direct_programme()
Passer_element_lecture_suivant()
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
gIndex_trouve = Donner_index_element_suivant(gItem_lecture)
If gIndex_trouve <> -1
gbRetourPrechargement = PreCharger_element_liste(gIndex_trouve)
Select gbRetourPrechargement
Case #LECTURE_LISTE_ITEM_CHARGEMENT_OK
Case #LECTURE_LISTE_ITEM_CHARGEMENT_MAX_ERREURS
Ecrire_dernier_etat (gFichierPlayliste$, Tableau_elements(gIndex_trouve)\Code, Tableau_elements(gIndex_trouve)\Id, #True, Tableau_elements(gIndex_trouve)\NbRotations)
Terminer_programme_erreur()
Case #LECTURE_LISTE_ITEM_CHARGEMENT_TENTER_ELEMENT_SUIVANT
Changer_etat_lecture(#LECTURE_LISTE_ITEM_SUIVANT)
EndSelect
Else
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_BOUCLER)
EndIf
Case #LECTURE_CAGE_DIRECT_ENCOURS
Maj_cage_direct_programme()
Case #LECTURE_CAGE_DIRECT_FIN
Terminer_cage_direct_programme()
Afficher_message ("La cage direct est terminée lance le fichier préchargé !")
Ajouter_au_log ("La cage direct est terminée lance le fichier préchargé !", #LOG_NORMAL)
Envoyer_message_retour_diffusion ("La cage direct est terminée lance le fichier préchargé !")
gbRetourPrechargement = #LECTURE_LISTE_ITEM_CHARGEMENT_RESET
Changer_etat_lecture(#LECTURE_LISTE_ITEM_PRET)
EndSelect
Case #TIMER01
Gerer_barres_information()
Gerer_lancement_automatique_fichier_programmation()
Gerer_affichage_lectures_playliste()
Raffraichir_stats()
Case #TIMER02
Gerer_action_serveur()
Case #TIMER03
Envoyer_message_site("Effacement fichier report fonctionnement.", "Effacer")
If gEtat_lecture = #LECTURE_CAGE_DIRECT_ENCOURS
Envoyer_message_site("En ligne : " + Donner_jouer_et_heure() + " - EN DIRECT ! - ", "Ecrire")
Else
If GetGadgetState (Checkbox_direct_manuel_donnees_off) = #PB_Checkbox_Checked
Envoyer_message_site("En ligne : " + Donner_jouer_et_heure() + " - EN DIRECT ! - ", "Ecrire")
Else
Envoyer_message_site("En ligne : " + Donner_jouer_et_heure(), "Ecrire")
EndIf
EndIf
Case #TIMER04
Afficher_stats()
Case #TIMER05
If gbAfficherOnde = #True
Gerer_affichage_onde_sonore()
EndIf
EndSelect
EndSelect
Until gfini
Envoyer_infos_site_arret_webradio()
FMOD_Fermer()
End
Re: Monitoring de programme, crash
Avec du temps j'ai revu le code. Des petites corrections par ci et par là. Mais c'est surtout le fait de basculer sur une architecture client/serveur. Avec les fichiers musicaux sur un NAS qui règle les soucis de chargements. C'est le processeur et le disque dur du NAS qui décharge l'ordinateur.