Progress bar lors de l'execution d'un .exe

Signaler
Messages postés
4
Date d'inscription
vendredi 25 juin 2021
Statut
Membre
Dernière intervention
28 juin 2021
-
Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
-
Bonjour,

Je développe une interface dans laquelle j'appelle un logiciel de calcul qui est un .exe
Le temps d'exécution variant entre 1 et 3 minutes selon les données d'entrée, je cherche à afficher une progress bar à l'utilisateur pour qu'il sache que l'appli ne bug pas mais que l'exécution est assez long

Le problème est qu'en faisant une progress bar juste avec un timer qui s'active lorsque le proccess exe est lancé, puis s'arrête lorsque le proccess est terminé, je ne parvient pas à l'update. La progress bar ne réagit pas

J'ai également essayé avec un BackGroundWorker et un thread mais celui-ci se lance seulement une fois que le proccess est terminé

Voici le code que j'ai pour l'instant




Private Sub Btn_hydro_Click(sender As Object, e As EventArgs) Handles btn_hydrolysys.Click

'Paramètres pour le processus
proc.StartInfo.WorkingDirectory = "C:\Users\Guigs\Test"
proc.StartInfo.FileName = "C:\Users\Guigs\Test1.exe"
proc.StartInfo.CreateNoWindow = True

Try
proc.Start()

While proc.HasExited = False
startBgw()
End While




proc.WaitForExit()




Catch ex As Exception 'si l'executable n'est pas lu
MessageBox.Show("the processus is already running or the executable is lacking")

End Try



End Sub

Private Sub startBgw()
bgw.WorkerReportsProgress = True
bgw.RunWorkerAsync()
End Sub

Sub bgw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bgw.DoWork



For i As Integer = 0 To 10000
If i Mod 1000 Then
bgw.ReportProgress(i / 100)
End If
Next

End Sub

Sub bgw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bgw.ProgressChanged


ProgressBar1.Value = e.ProgressPercentage

End Sub



Si quelqu'un a une idée comment je pourrais donc afficher une barre de progression pendant l'exécution du logiciel !

Merci par avance

7 réponses

Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
557
Ce que tu as fait là déclenche backgroundworker après l'exécution de ton exe.
Ce qu'il faut c'est soit déclencher le backgroundworker avant, soit que ce soit lui qui lance l'exe.

Je te fais un exemple un peu plus tard.


PS, tu as essayé d'utilisé les balises de code, effort que tout le monde ne fait pas et je t'en remercie. Mais elles ne sont pas très intuitive et comme tu le constates ça donne un pavé gris tout moche.
Pour les prochains messages, voici une petit tuto sur leur bonne utilisation https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
4
Date d'inscription
vendredi 25 juin 2021
Statut
Membre
Dernière intervention
28 juin 2021

Même si je déclenche le bgw avant ça fonctionne pas ...
Si tu as le temps de me faire un exemple ça m'aiderait certainement bcp, merci !

D'accord je vais jeter un œil pour les balises
Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
557
Voilà l'exemple en lançant l'exe dans le thread du backgroundworker
    Private Sub ExempleBGW()
        ProgressBar1.Visible = True

        Dim bgw As New BackgroundWorker()

        bgw.WorkerReportsProgress = True 'necessaire pour envoyer l'avancement du calcul

        AddHandler bgw.ProgressChanged, AddressOf Bgw_ProgressChanged

        AddHandler bgw.DoWork, AddressOf Bgw_DoWork 'abonne le BGW à la méthode qui fera le travail de fond.

        AddHandler bgw.RunWorkerCompleted, AddressOf Bgw_RunWorkerCompleted 'abonne le BGW à la méthode qui sera éxécutée quand le travail sera finit

        bgw.RunWorkerAsync() 'Démarre le travail de fond
    End Sub


    Private Sub Bgw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim proc As New Process

        proc.StartInfo.FileName = "ExeLong.exe"
        proc.StartInfo.CreateNoWindow = True
        proc.Start()

        Dim i As Integer = 0
        While proc.HasExited = False
            i += 1
            'on déclenche un évènement avec les informations de progression et de travail (en l'état un char)
            CType(sender, BackgroundWorker).ReportProgress(i)

            If i = 100 Then i = 0
            Thread.Sleep(500)
        End While

        e.Result = "C'est fini!" 'définit un resultat
    End Sub

    Private Sub Bgw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage 'affiche le pourcentage dans une progressbar
    End Sub

    Private Sub Bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        ProgressBar1.Visible = False

        MessageBox.Show(CStr(e.Result))
    End Sub


Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
557
Il est vrai que ma 2eme proposition était incorrecte, car le thread principal est bloqué par l'exécution de l'autre programme
Messages postés
4
Date d'inscription
vendredi 25 juin 2021
Statut
Membre
Dernière intervention
28 juin 2021

Super merci !
J'ai testé dans un projet uniquement avec la progress bar ça fonctionne

Mais dans le projet que je devéloppe ça fonctionne pas car le .exe créé un fichier qui est lu par un Reader sauf que le fichier n'est pas encore créé lorsque le reader essaie de le lire, c'est possible de continuer la lecture du code après le BackGroundWorker après que le processus soit terminé ?

Je sais pas si c'est clair, sinon je donnerai plus d'informations concernant le code

Merci d'avance
Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
557
avec plus de détails ce sera mieux.
Messages postés
4
Date d'inscription
vendredi 25 juin 2021
Statut
Membre
Dernière intervention
28 juin 2021

Hello,

Du coup j'ai fais des test sans le bgw car je ne suis pas certain qu'il soit indispensable.

Pour que le programme .exe ne soit pas bloqué j'ai supprimé la commande


proc.WaitForExit()


Voci le code que j'ai pour l'instant


Private Sub Btn_test_Click(sender As Object, e As EventArgs) Handles btn_test.Click

   Dim psi As New ProcessStartInfo
       psi.WorkingDirectory = "C:\Users\Guigs\Test"
        psi.FileName = "C:\Users\Guigs\Test1.exe"
        psi.CreateNoWindow = True

        externalProcess = Process.Start(psi)

        ProgressBar1.Show()

End Sub


 Private Sub externalProcess_Exited(sender As Object, e As EventArgs) Handles externalProcess.Exited
        ProgressBar1.Hide()

        externalProcess.Dispose()
        externalProcess = Nothing

        MessageBox.Show("Process complete")
    End Sub




Le problème est que le .exe créé un fichier lors de son exécution, et si j'enlève le

proc.WaitForExit()


La lecture du code continue et n'attend pas la création du fichier, ce qui pose problème car j'ai besoin de le lire et de l'afficher dans un DataGridView dès que le .exe a terminé son exécution.

En espérant être assez clair, merci d'avance
Messages postés
16136
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 août 2021
557
Bonjour

Passer par un thread (quelqu’il soit) est nécessaire pour éviter que l’application fige.

Donc tant que tu neveux pas de backgroundworker ou autre, ça figera