Exécution d'un programme et attendre la fin de l'exécution de façon non bloquante

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 375 fois - Téléchargée 32 fois

Contenu du snippet

Permet d'exécuter un fichier et d'attendre la fin de l'exécution sans figer le programme en cours

Source / Exemple :


#Region " Constantes "
    Public Const SW_HIDE As Short = 0
    Public Const SW_SHOWNORMAL As Short = 1 ' Restores Window if Minimized or
    'Minimized
    Public Const SW_SHOWMINIMIZE As Short = 2
    ' Maximized
    Public Const SW_SHOWMAXIMIZE As Short = 3
    'NoActivate
    Public Const SW_SHOWNOACTIVE As Short = 4
#End Region

#Region " API "
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
        (ByVal hwnd As Integer, ByVal lpOperation As String, ByVal lpFile As String, _
        ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Integer) _
        As Integer

    Private Declare Function FindExecutable Lib "shell32.dll" Alias "FindExecutableA" _
        (ByVal lpFile As String, ByVal lpDirectory As String, ByVal lpResult As String) As Integer
#End Region

    Public Const csExe$ = ".exe"
    Public Sub sbShell(ByVal S As String, Optional ByVal Args As String = "", _
            Optional ByVal ProcStyle As Short = SW_SHOWNORMAL)
        Try
            Dim MyProcess As New ProcessStartInfo(S, Args)
            Select Case ProcStyle
                Case SW_SHOWNORMAL
                    MyProcess.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
                Case SW_HIDE
                    MyProcess.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
                Case SW_SHOWMAXIMIZE
                    MyProcess.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized
                Case SW_SHOWMINIMIZE
                    MyProcess.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized
            End Select
            MyProcess.UseShellExecute = True
            Dim P As Process = Process.Start(MyProcess)
            Do
                Application.DoEvents()
                System.Threading.Thread.CurrentThread.Sleep(1)
            Loop Until P.HasExited
        Catch ex As Exception

        End Try
    End Sub

    Public Sub sbLanceFichier(ByVal hWnd As Integer, ByVal Fichier As String, _
            Optional ByVal bMax As Boolean = False, Optional ByVal typAff As Short = SW_SHOWNORMAL, _
            Optional ByVal bWait As Boolean = False)
        Try
            Dim RetVal As Integer
            Dim Ext$ = System.IO.Path.GetExtension(Fichier$)
            If Ext <> csExe And Ext <> "" Then
                Dim Rep As String, SH As Short = SW_SHOWNORMAL
                If bMax Then
                    SH = SW_SHOWMAXIMIZE
                ElseIf typAff <> SW_SHOWNORMAL Then
                    SH = typAff
                End If
                Dim Exec As String = New String(Chr(0), 255)
                RetVal = FindExecutable(Fichier, Rep, Exec)
                If RetVal > 32 Or Trim$(Exec) <> "" Then
                    If Rep Is Nothing Then
                        Rep = Left(Fichier, 3)
                    End If
                    Exec = Left(Exec, InStr(Exec, Chr(0)) - 1)
                    If Not bWait Then
                        ShellExecute(hWnd, "open", Exec, Fichier, _
                            Rep, SH)
                    Else
                        modProcess.sbShell(Exec, Fichier, SH)
                    End If
                End If
            ElseIf Ext <> "" Then
                sbShell(Fichier, , typAff)
            Else
                sbShell("explorer.exe", "/e,""" & Fichier & """", typAff)
            End If
        Catch ex As Exception
            gMsg.sbMsgCr(ex.Message, "modShell.sbLanceFichier")
        End Try
    End Sub

Conclusion :


La procedure sbShell permet de rendre la main aux événements de l'application sans altérer le déroulement du programme en attendant la fin de l'exécution

A voir également

Ajouter un commentaire

Commentaires

spidermario
Messages postés
130
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
14 mars 2009
-
C'est bien dans l'ensemble mais pour les constantes, tu pourrais utiliser une énumération.
cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61 -
Message de test (suite à ta demande aux admins)
Tu me diras si tu en as été averti.
Depuis 15h, le serveur de mail surchauffe, alors il est possible que le mail qui averti t'arrive ... mais un peu plus tard.
Confirme moi, stp, par message privé.
Jack
cs_eldim
Messages postés
961
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
Excellente suggestion Proger, Merci

Le Sleep 1 Fonctionne parfaitement sans surcharger le processeur

En plus j'avais oublier de préciser le thread sur lequel faire le sleep

Je modifie le code en conséquence
cs_eldim
Messages postés
961
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
Merci, je vai tester

J'ai besoins de l'équivalent :
Shell Fichier,wait:=true

Sans bloquer l'appli

pour que mon prog attende la fin de l'exécution, tout en conservant l'interface active

c'est pour ça que j'ai du mal à réaliser ça avec le callback car le callback semble terminer la procedure en cours sans attendre la fin de l'exécution
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
perso j'ai surtout besoin de l'évenementielle (callback), mais si c'est pas ton cas...
Mets-donc sleep(1) au lieu de 100 ! :)

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.