Attente de fin d'execution d'un programme [Résolu]

francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention - 4 avril 2008 à 10:54 - Dernière réponse : francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention
- 7 avril 2008 à 11:24
Bonjour,
Je programme une interface utilisateur en visual basic 2005 pour un programme de calcul écrit en fortran.
Avec System.Diagnostics.Process.Start( ) je lance l'application fortran dans la console windows.
Ensuite je dois attendre que cette application soit terminée pour continuer la routine vb...
j'ai tenté de regarder dans WaitForSingleObject .... mais sans résultat...

comment puis-je faire "attendre" vb jusqu'à la fin de l'execution du programme fortran?

merci de votre aide!!
Afficher la suite 

Votre réponse

9 réponses

Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 avril 2008 à 13:14
+3
Utile
gardes l'instance de Process qui t'es renvoyée.

en l'occurrence, il s'agira de tester :

myProcess.hasExited
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Renfield
Manolitoos 14 Messages postés samedi 10 septembre 2005Date d'inscription 4 avril 2008 Dernière intervention - 4 avril 2008 à 11:12
0
Utile
Salut,

Peut-être qu'en scrutant les processes, tant qu'il existe, le programme attend et une fois qu'il a disparu des processus, c'est ok.

 Manolitoos
Commenter la réponse de Manolitoos
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 avril 2008 à 11:35
Commenter la réponse de Renfield
francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention - 4 avril 2008 à 11:48
0
Utile
Hey! merci de ta réponse rapide!!
en fait j'utilise déjà le code ci-dessous pour scruter les processes


Public Function IsProgramRunning() As Boolean
        Dim isRunning As Boolean
        Dim localAll As Process() = Process.GetProcesses()
        Dim length As Integer

        length = localAll.GetLength(0)

        isRunning = False

        For i As Integer = 0 To length - 1
                       If localAll(i).ToString.Contains("ProgrammeName") Then
                isRunning = True
            End If
        Next

        Return isRunning
    End Function

et dans le code appelant la fonction je fais une boucle

Do While isProgramBusy = True
                        isProgramBusy = IsProgramRunning()
                        System.Threading.Thread.Sleep(500)
Loop

le problème est d'une part que mon interface vb est totalement inactive pdt le sleep et surtout qu'apres 60 secondes
j'ai le message d'erreur suivant (traduit automatiquement de l'allemand...) qui bloque mon programme:

Le CLR ne pouvait exécuter pendant 60 secondes aucun passage(passerelle) du contexte COM 0x1a0848 au contexte COM 0x1a09b8. Le fil, le propriétaire du contexte de but /-apartments est, attend sans déplacer des annonces, ou une opération de longue durée très longtemps traite sans déplacer des annonces de Windows. Une telle situation perturbe, habituellement, l'exécution(la productivité) et peut mener même vers ce que l'emploi(application) ne réagit plus ou la charge de mémoire augmente toujours. A l'évitement de ce problème, tous les fils STA devaient utiliser les types primitifs qui déplacent des annonces (par exemple CoWaitForMultipleHandles) au poste d'observation, et lors de longues opérations de longue durée




déplacent








généralement des annonces .
Commenter la réponse de francoisIAG
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 avril 2008 à 12:03
0
Utile
euh... je crois que tu n'a lus ce que je t'ai filé...

ton IsProgrammRunning peut etre remplacé

par Process.hasexited

ton
Do While isProgramBusy = True
isProgramBusy = IsProgramRunning()
System.Threading.Thread.Sleep(500)
Loop

peut etre remplacé par
Process. waitforexit

et si tu ne souhaites pas bloquer ton programme pendant l'attente, utilise l'evenement onexited
Commenter la réponse de Renfield
francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention - 4 avril 2008 à 13:05
0
Utile
Désolé j'étais un peu décalé..

comment indiques tu le nom du process avec process.hasexited ?

si tu le lance avec
myProcess = Process.Start("Notepad.exe") ,par exemple, pas de problème
mais s'il est déjà lancé et qu'on attend juste qu'il se termine comment lui indiquer le nom?
Commenter la réponse de francoisIAG
francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention - 4 avril 2008 à 13:23
0
Utile
ma question était en fait : comment lui indiquer que c'est le process "notepad.exe" qui m'interesse ?

merci de ta patience!!
Commenter la réponse de francoisIAG
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 avril 2008 à 13:49
0
Utile
tu dois récuperer un objet Process...
a faire si le programme est lancé par l'utilisateur...

si c'est toi qui fais un Process.Start, il est bien plus simple de conserver l'instance a ce moment là
Commenter la réponse de Renfield
francoisIAG 5 Messages postés mercredi 13 février 2008Date d'inscription 7 avril 2008 Dernière intervention - 7 avril 2008 à 11:24
0
Utile
Merci Renfield!
Commenter la réponse de francoisIAG

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.