Il y a quelques temps, j'ai eu à réaliser un programme tournant en tâche de fond . Il devait lancer, au fur et à mesure que des documents se présentaient,lancer un programme avec un chaine de commande correspondant aux documents.(ShellExecute). Aux tests, tout était parfait. En mise en production, les documents arrivaient tellement vite que j'avais des centaines de programme lancés quasi simultanément et la machine s'effondrait litéralement sous la charge. J'ai donc developpé ce composant qui prends en charge le lancement et l'arret du programme lancé, ce qui permet par exemple de ne lancer un autre programme que quand un autre est fini.
En y étant, j'ai peaufiné le composant qui est maintenant capable de lancer l'excécution d'un programme avec ou sans chaîne de commande, de lancer un fichier (s'il est de type connu de windows).Le tout en choissisant le mode fenêtre (Normal,Minimisé,Maximisé,Masqué) el le mode synchrone ou asynchrone.
Cerise sur le gateau, il est possible de donner une indication personnalisée qui sera liée au programme lancé, qui sera bien utile s'il y a plusieurs occurences du même programme.
Lancer un programme se fait par la commande
LandF1.ShellProg NomExe, Commande, Synchrone, WindowStyle , Tag
Un événement est levé quand le programme demarre
1 2 3 4 5
| Private Sub LandF1_Started(ProgName As String, Cmd As String, Tag As Variant, ProcessId As Long)
MsgBox "Le programme " & ProgName & " vient de démarrer" & vbCrLf & _
"Chaine de commande : " & Cmd & vbCrLf & _
"Tag personalisé : " & Tag
End Sub |
Et quand il se termine
1 2 3 4 5
| Private Sub LandF1_Finished(ProgName As String, Cmd As String, Tag As Variant, ProcessId As Long)
MsgBox "Le programme " & ProgName & " vient de se terminer" & vbCrLf & _
"Chaine de commande : " & Cmd & vbCrLf & _
"Tag personalisé : " & Tag
End Sub |
Reste une derniére possibilité du composant, killer le programme
LandF1.TerminateProg ProcessId
ProcessId ayant été fourni par l'evénement Started
OCX DiLaunchAndForget6.zip
Partager