none
Procédure de reprise RRS feed

  • Question

  • Bonjour, voilà j'ai un programme qui fonctionne (du moins pour le moment) et j'aimerai créer une procédure de reprise pour permettre au programme de repartir si jamais il plante. Le seul problème c'est que je n'ai aucune idée de comment en créer une, toute aide est donc la bienvenue.

    Cordialement, maxkun

    mercredi 23 novembre 2011 07:08

Réponses

  • EhJoe,

    Nous sommes dans une communauté d'entre aides où nous participons, partageons des idées, sur des réalisations.
    Chacun fait comme il veut en fonction des solutions proposer, ce n'est pas parce que vous êtes l'auteur de la plus par des idées qu'il faut être familier et un tantinet moqueur sur des solutions qui ne son pas vos idées.


    Donc mon idée n'a rien d'une usine à gaz
    Je pars sur le principe que l'application principale plante ou l'application n'est pas en cause mais plutôt le système ou une autre application qui ferait planté pour X raison!


    Le code ci dessous est a amélioré, c'est juste une idée de départ : 

    1. Application Principale

    Imports System.IO


    Public Class Form1

        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            'Travail courant de l'application
            Label1.Text = Now
        End Sub

        Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
            Try
                ' Creation du fichier pour la fermeture
                Dim CloseApp As New StreamWriter("C:\temp\CloseAppPrincipal.txt")
                CloseApp.Close()

            Catch ex As Exception
                MsgBox("Error :" & ex.Message) 'l'ecriture de fichier n'est peut etre pas possible
                Application.Restart() ' Relance l'application
            End Try
        End Sub

        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

            Try
                'Si le fichier existe au load on le supprime
                If File.Exists("C:\temp\CloseAppPrincipal.txt") = True Then File.Delete("C:\temp\CloseAppPrincipal.txt")

                ' Lance l'autre application au demarrage
                Dim AppPathPrinc = Path.Combine(Application.StartupPath, "AppSecondaire.exe")
                Process.Start("cmd.exe", "/c " & """" & Path.Combine(Application.StartupPath, "AppSecondaire.exe") & """")
            Catch ex As Exception
                MsgBox(ex.Message) 'application secondaire introuvable
            End Try

        End Sub
    End Class

    • L'application Secondaire

    Imports System.IO
    Public Class Form1
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

            If Process.GetProcessesByName("AppPrincipal").Length = 0 Then
                Process.Start(Path.Combine(Application.StartupPath, "AppPrincipal.exe"))
            End If
            If File.Exists("C:\temp\CloseAppPrincipal.txt") = True Then Me.Close()
        End Sub
    End Class

     

    A bientot


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Marqué comme réponse maxkun mercredi 7 décembre 2011 12:11
    mardi 6 décembre 2011 20:10
    Auteur de réponse
  • Bonjour Maximus,

    A l'époque on avait évoqué des fichiers non taités (coupue d'alimentation de l'ordinateur par exemple), mais si c'est pour le code, faut faire ce qu'a commencé d'indiquer Mourad

     

    Option Explicit On
    Public Class Form1
      Public feuille As String = "Form 1, " ' dans form 1
      Public adr As String
      Public mes As String = "RECOPIEZ ET SIGNALEZ CE MESSAGE"
      Public s = vbLf & vbLf
    
    
      Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        adr = ",  0001"
        Try
          Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\FicInexistant.rab"))
        Catch ex As Exception
          If Err.Number = 53 Then
            MsgBox(Err.Number & s & Err.Description & s & feuille & sender.ToString & adr & s & mes, vbCritical)
            ' ici ce sera création du fichier
            ' SINON
            'Reset() 'ferme tous fichiers
            'End
          End If
        End Try
      End Sub
    
    End Class
    
    

    L'utilité du signalement c'est qu'immédiatement tu sais plusieurs années après, dans le programme, où est l'erreur et quelle est-elle, ce qui fait gagner du temps...

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 24 novembre 2011 09:26

Toutes les réponses

  • Bonjour Maximus,

     

    Je crois savoir de quoi tu parles, mais je n'ai plus tout en tête :

     

    Le principe en gros, te concernant, c'est de créer dans un répertoire un double avant tout autre action, puis quand toute action est terminée, on efface le répertoire en double (fonctionnement normal).

     

    De facto, quand on lance le programme on va lire le répertoire des doubles, il doit être absent, s'il ne l'est pas c'est que des opérations n'ont pu être effectuées, alors dans ce cas on reprend le cadre des opérations restantes en copiant les fichier dans l'ancien répertoire de travail et en lançant le code qui doit les traites, puis effacer leur double (le répertoire), on peut imaginer un cas extrême ou le répertoire des double serait vide, dans ce cas on l'efface simplement.

     

    Ça c'est la procédure de reprise sur des fichiers.

     

    *

     

    On peut aussi avoir besoin d'une procédure de reprise dans le code (anomalie extérieure survenant durant le fonctionnement).

    Dans ce cas, par exemple, une procédure aura la configuration suivante:

     

    Dim parameters à sauver  ' … global

    Dim reprise As boolean  = false ' global

     

    Sub procedureDeTravail()

      if reprise = true then goto adresseDeReprise

      code avant reprise …

      SI on reste dans la procédure alors goto suite 

      SI on sort de la procédure

        sauvegarde des paramètres dans des variables globales

        reprise = True

        exit sub

      end if

    adresseDeReprise:

      reprise = false

      restauration des paramètres + continuation en séquence

    suite:

      continuation du code …

    End Sub

     

     

    Est-ce que c'est ce que tu veux ?

     

    Au plaisir, cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 23 novembre 2011 15:43
  • Bonjour,

     

    En général le plantage d'un programme revient à dire qu'il a provoqué une exception qu'il n'intercepte pas.

    Une manière d'assurer la reprise d'un programme qui plante consisterait en intercepter toute exception non gérée (plantage) au niveau le plus haut (méthode Main)  puis il suffit de reprendre le travail si une exception est interceptée.

    Le mécanisme d'interception d'exceptions s'identifie à un bloque Try/Catch.

    Voici un exemple qui pourrait vous servir de pattern :

       Sub Main()
            Try
                'Lancement de l'application
                 LancerApplication()
            Catch ex As Exception
                'Plantage
    
                'Le mieu serait de faire le nettoyage des ressource utilisé ici si nécessaire quite à dédier une procédure à ce ci
    
                'Relancement de l'application
                LancerApplication()
            End Try
        End Sub
    
        Sub LancerApplication()
            'Mettre ici votre code de lancement de l'application
        End Sub


    Cordialement.


    mercredi 23 novembre 2011 19:34
    Auteur de réponse
  • Bonjour,

    Pour ce qui me concerne je favoriserai le BackgroundWorker "ou" dans l’événement RunWorkerCompleted on pourrais intercepté les erreurs (les exception inconnu) qui ce trouve dans le DoWork alors on pourrais facilement prévoir "le quoi faire" dans le cas ou il rencontre une erreur (exceptions), par exemple redémarrer l'application ...

    Il est relativement facile a comprendre comment ça fonctionne quand on met le nez dedans ...
    Nous seront, dans tout les cas, là pour vous aidés

     

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mercredi 23 novembre 2011 20:19
    Auteur de réponse
  • Mourad et Xavier,

    Pour information : ayant contribué à une partie du programme, si c'est celui-ci (je présume), il confirmera...

    Le plantage principal était notamment une extinction de l'ordinateur (sans onduleur), en cours d'exécution du programme, ou encore l'envoi d'un fichier à un ordinateur ou une imprimante éteint...

    La fonction principale du programme étant de réceptionner puis de répartir des fax par l'envoi à différents ordinateurs et imprimantes...

    On va voir ce qu'il en dit...

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 23 novembre 2011 20:30
  • Bonjour à tous :)

    C'est vrai que EhJoe m'as fourni pas mal d'aide pour lancer mon projet :)

    Après pour ce qui est des bugs, j'en ai de toute sortes...

    Par exemple je viens de tester mon programme en réel et j'ai eu une erreur que je n'avais pas avant, donc à chaque étape, on découvre toujours des erreurs...

    En ce qui concerne la plupart de mon code, il est vrai que j'ai pas mal de bloc try pour éviter que le code ne s'arrète, j'ai regarder vos proposition et j'avoue que je ne sais pas trop vers laquelle m'orienté, la plus simple et plus efficace a coder m'irait le mieux je pense :)

    Cordialement, maxkun

    jeudi 24 novembre 2011 08:20
  • Bonjour Maximus,

    A l'époque on avait évoqué des fichiers non taités (coupue d'alimentation de l'ordinateur par exemple), mais si c'est pour le code, faut faire ce qu'a commencé d'indiquer Mourad

     

    Option Explicit On
    Public Class Form1
      Public feuille As String = "Form 1, " ' dans form 1
      Public adr As String
      Public mes As String = "RECOPIEZ ET SIGNALEZ CE MESSAGE"
      Public s = vbLf & vbLf
    
    
      Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        adr = ",  0001"
        Try
          Dim p As New System.IO.StreamReader(CStr(My.Application.Info.DirectoryPath & "\FicInexistant.rab"))
        Catch ex As Exception
          If Err.Number = 53 Then
            MsgBox(Err.Number & s & Err.Description & s & feuille & sender.ToString & adr & s & mes, vbCritical)
            ' ici ce sera création du fichier
            ' SINON
            'Reset() 'ferme tous fichiers
            'End
          End If
        End Try
      End Sub
    
    End Class
    
    

    L'utilité du signalement c'est qu'immédiatement tu sais plusieurs années après, dans le programme, où est l'erreur et quelle est-elle, ce qui fait gagner du temps...

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 24 novembre 2011 09:26
  • Alors j'ai regarder ton code EhJoe et il y a quelque chose que je ne comprend pas, d'ou vient ton button??

    J'ai vu que tu as créer une fonction buttonclik, or dans mon code tout est fait automatiquement et on ne doit pas avoir besoin de cliquer sur un bouton?

    jeudi 24 novembre 2011 10:18
  • Max, le bouton ne sert qu'à lancer le test, on peut l'enlever... [1]

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    jeudi 24 novembre 2011 11:21
  • Ok d'accord :)

    Je vais essayer ça et je vous tiens au courant :)
    jeudi 24 novembre 2011 12:55
  • Alors j'ai fait la méthode à Mourad, c'est à dire que j'ai mit mon code dans une méthode et j'ai tout englobé dans bloc Try/Catch. Ensuite j'ai rajouté un bouton avec la méthode buttonClick, cependant j'ai quelques petites questions sur son fonctionnement, que fait exactement cette méthode??

    Le dossier FicInexistant.rab sert à quoi?? Et pour avoir rajouter l'extension .rab? (je ne connais pas ce type d'extension)

    vendredi 25 novembre 2011 09:01
  • Bionjour Maxim,

    L'extension rab c'est pour l'exemple, j'avais crée des faux fichiers vides avec extension rab pour tester, il faut en fait mettre l'extension que tu recherches.

    Le bouton comme sus-indiqué n'est la que pour lancer le test, en général le code sera inséré dans le reste sans procédure avec bouton.

    L'exemple est celui de Mourad, en fait celui d'un TRY qui indique un fichier inexistant sur une tentative de lecture, j'ai simplement rajouté des indications permettant en cas d'erreur, que l'utilisateur soit informé des éléments à transmettre à celui qui gère le code afin d'aller droit à l'endroit de lerreur (programmes, form, procédure, adresse dans la procédure)...

    *

    Mais bon, en fait tu voulais faire une procédure de reprise sur quoi, à quelle occasion ?

    Cordialement :o)

     

     

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 25 novembre 2011 09:23
  • Et bien plus une procédure de reprise si jamais le programme s’arrête brutalement suite a un gros plantage, car je ne pense pas que j'aurais beaucoup d'erreur dans le code qui le forceront à s’arrêter car j'ai pas mal de bloc try/catch pour éviter cela justement.

    (PS: ça n'a rien a voir, mais comment met ton un lien en signature???)


    Cordialement, maxkun ;) [url=http://metinworld.perso.sfr.fr/]Mon site perso[/url]
    • Modifié maxkun vendredi 25 novembre 2011 09:26
    vendredi 25 novembre 2011 09:26
  • ... Un lien, souvent dans l'à-propos, "contacter l'auteur", "site de l'auteur"...

     

    Cordialement.



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    vendredi 25 novembre 2011 09:44
  • (Ok merci , j'ai mis ça dans la rubrique de mon profil :) )
    Cordialement, maxkun ;)
    vendredi 25 novembre 2011 10:06
  • Bonjour, Maxkun,

     

    Est-ce que vous avez réussi à résoudre votre problème en utilisant les informations reçues ? Dans l’affirmative, pouvez-vous svp marquer les messages qui vous ont aidé avancer en utilisant l’option « Marquer comme réponse » ?

     

    Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 28 novembre 2011 07:48
  • Bonjour, et bien je dirais que non car mon programme en lui même fonctionne bien, et quand il y a une exception non gérée a l'intérieur il ne se ferme pas car tout est dans un bloc try/catch, mais si jamais le programme se ferme brutalement je n'ai toujours pas de solution pour le forcer a se relancer.
    Cordialement, maxkun ;)
    mardi 6 décembre 2011 07:27
  • Maxkun,

    A ma connaissance je connais aucun moyen fiable sous forme de code qui permet de faire la détection.
    Mais nous pouvons voir le problème autrement en créant un autre programme qui va vérifier l’exécution de l'autre
    Voilà, comment je vois la chose
    Le programme principal va lancer le programme secondaire qui va faire la vérification du programme principal
    Si le programme principal plante sans créer de fichier c'est que l'application a bien planté et donc le programme secondaire relancera l'application principal.
    Si le fichier existe l'application principal c'est fermé correctement alors on quitte les deux applications.

     

    Je pense que c'est relativement facile a réaliser ...


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mardi 6 décembre 2011 15:39
    Auteur de réponse
  • Bonjour Xavier,

     

    Oui, avec un Timer l'appliation 2 surveille la 1, et puis la 2 est surveillée par la 3 qui est surveillée par la 4 :o)

    Même que, comme c'est du réseau, on peut mettre un exe sur chaque poste, qui teste si le programme est là, et s'il n'est pas là il le relance, une usine à gaz...

    Les procédures de reprises c'est surtout sur une action inachevée, qui est constatée au nouveau lancement de l'appliation en cause.

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

    • Modifié EhJoe mardi 6 décembre 2011 15:51 rajout
    mardi 6 décembre 2011 15:48
  • EhJoe,

    Nous sommes dans une communauté d'entre aides où nous participons, partageons des idées, sur des réalisations.
    Chacun fait comme il veut en fonction des solutions proposer, ce n'est pas parce que vous êtes l'auteur de la plus par des idées qu'il faut être familier et un tantinet moqueur sur des solutions qui ne son pas vos idées.


    Donc mon idée n'a rien d'une usine à gaz
    Je pars sur le principe que l'application principale plante ou l'application n'est pas en cause mais plutôt le système ou une autre application qui ferait planté pour X raison!


    Le code ci dessous est a amélioré, c'est juste une idée de départ : 

    1. Application Principale

    Imports System.IO


    Public Class Form1

        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            'Travail courant de l'application
            Label1.Text = Now
        End Sub

        Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
            Try
                ' Creation du fichier pour la fermeture
                Dim CloseApp As New StreamWriter("C:\temp\CloseAppPrincipal.txt")
                CloseApp.Close()

            Catch ex As Exception
                MsgBox("Error :" & ex.Message) 'l'ecriture de fichier n'est peut etre pas possible
                Application.Restart() ' Relance l'application
            End Try
        End Sub

        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load

            Try
                'Si le fichier existe au load on le supprime
                If File.Exists("C:\temp\CloseAppPrincipal.txt") = True Then File.Delete("C:\temp\CloseAppPrincipal.txt")

                ' Lance l'autre application au demarrage
                Dim AppPathPrinc = Path.Combine(Application.StartupPath, "AppSecondaire.exe")
                Process.Start("cmd.exe", "/c " & """" & Path.Combine(Application.StartupPath, "AppSecondaire.exe") & """")
            Catch ex As Exception
                MsgBox(ex.Message) 'application secondaire introuvable
            End Try

        End Sub
    End Class

    • L'application Secondaire

    Imports System.IO
    Public Class Form1
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

            If Process.GetProcessesByName("AppPrincipal").Length = 0 Then
                Process.Start(Path.Combine(Application.StartupPath, "AppPrincipal.exe"))
            End If
            If File.Exists("C:\temp\CloseAppPrincipal.txt") = True Then Me.Close()
        End Sub
    End Class

     

    A bientot


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    • Marqué comme réponse maxkun mercredi 7 décembre 2011 12:11
    mardi 6 décembre 2011 20:10
    Auteur de réponse
  • Bonsoir Xavier,

    De l'humour seulement, et l'humour est moqueur généralement, mais ton idée est très bonne, ça n'interdit pas d'en plaisanter, l'informatique n'oblige pas d'être sérieux sans cesse ; la preuve, à la fin je rajoute une autre idée...

    Cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 6 décembre 2011 20:37
  • Bonjour à tous :)

    Merci pour vos solution, mais Xavier tu dis plus haut :

    "Si le fichier existe l'application principal c'est fermé correctement alors on quitte les deux applications."

    Il faut savoir que le programme principal n'aura jamais a se fermer, il devra tourner sans cesse tourner en boucle.

    Es possible de gérer l'application principal à partir du processus, je m'explique. Quand je lance ma première application, un processus est créer, ma deuxième application peut-elle retrouver ce processus, et le relancer si jamais ce dernier se coupe??


    Cordialement, maxkun ;)
    mercredi 7 décembre 2011 07:34
  • Maxkun,

     

    • Pour répondre a votre question suivante :

    Es possible de gérer l'application principal à partir du processus, je m'explique. Quand je lance ma première application, un processus est créer, ma deuxième application peut-elle retrouver ce processus, et le relancer si jamais ce dernier se coupe??

    Oui c'est possible avec process ou Win32_Process (WMI) pour retrouver le chemin d’où il a été exécuté.

    Si votre programme doit sans cesse tourné pourquoi ne pas faire un service Windows ?


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mercredi 7 décembre 2011 10:04
    Auteur de réponse
  • "Si votre programme doit sans cesse tourné pourquoi ne pas faire un service Windows ?"

    Tout simplement car je ne savais pas :)

    En quoi cela consiste de mettre mon application en service Windows?


    Cordialement, maxkun ;)
    mercredi 7 décembre 2011 10:19
  • Ne vous lancez pas dans la programmation de service si vous ne savez pas faire, puis du moment que votre programme tourne comme ça c'est le principale.

    Vu que ce Thread (poste, ou fil de discussion) est résolut si vous avez d'autre question sur le "comment faire" n’hésitez pas a en ouvrir un autre.

    A bientôt


    Cordialement,
    Xavier TALOUR
    Alias Troxsa SendMail
    Voir le profil de Xavier TALOUR sur LinkedIn
    mercredi 7 décembre 2011 10:25
    Auteur de réponse
  • D'accord ça marche :)
    Cordialement, maxkun ;)
    mercredi 7 décembre 2011 10:28