Monitoring de programme, crash

Codes specifiques à Windows
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

Re: Monitoring de programme, crash

Message par hub73 »

Je ne laisserai pas le lien longtemps.
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

Re: Monitoring de programme, crash

Message par hub73 »

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 ?

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
Merci.
hub73
Messages : 126
Inscription : sam. 16/janv./2021 20:17

Re: Monitoring de programme, crash

Message par hub73 »

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.
Répondre