Meilleur auteur de réponses
Procédure de reprise

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
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 :- 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 ClassA bientot
Cordialement,
Xavier TALOUR
Alias Troxsa SendMail
- Marqué comme réponse maxkun mercredi 7 décembre 2011 12:11
-
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- Marqué comme réponse Ciprian Duduiala mardi 29 novembre 2011 07:06
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 -
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.
- Modifié Ould MouradEditor mercredi 23 novembre 2011 19:36
-
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ésA bientôt
Cordialement,
Xavier TALOUR
Alias Troxsa SendMail
-
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 -
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
-
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- Marqué comme réponse Ciprian Duduiala mardi 29 novembre 2011 07:06
-
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?
-
-
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)
-
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 -
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
-
-
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
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.
-
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 ;) -
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
-
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
-
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 :- 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 ClassA bientot
Cordialement,
Xavier TALOUR
Alias Troxsa SendMail
- Marqué comme réponse maxkun mercredi 7 décembre 2011 12:11
-
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 -
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 ;) -
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
-
-
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
-