Comment utiliser Process. Start dans Visual Basic Par Dan Mabbutt. Visual Basic Expert La méthode Start de l'objet Process est peut être l'un des outils les plus sous estimés à votre disposition en tant que programmeur. En tant que méthode, Start a une série de surcharges (différents ensembles de paramètres qui déterminent exactement ce que fait la méthode). Dans ce cas, les surcharges vous permettent de spécifier n'importe quel ensemble de paramètres que vous pouvez passer à un autre processus quand il démarre. Ce que vous pouvez faire avec Process. Start n'est vraiment limité que par les processus que vous pouvez utiliser avec elle. Continuer à lire ci dessous Qui est à dire, il n'y a aucune limite puisque plus continuer à venir tout le temps. Si vous souhaitez afficher votre fichier texte 34ReadMe34 dans le Bloc notes, il est aussi simple que: Ceci suppose que le fichier ReadMe se trouve dans le même dossier que le programme et que Notepad est l'application par défaut pour les types de fichiers. txt et it39s dans l'environnement système chemin. Pour les VB639ers dans le public, Process. Start ressemble un peu à la commande VB6 Shell. Dans VB6, vous pouvez utiliser quelque chose comme: lngPID 61 Shell (34MyTextFile. txt34, vbNormalFocus) Vous pouvez toujours appeler la commande Shell dans VB, mais je wouldn39t le recommander. Utilisez Process. Start à la place. Vous pouvez utiliser ce code à la place pour démarrer le bloc notes maximisé et créer un objet ProcessStartInfo que vous pouvez utiliser pour un contrôle plus précis: Dim ProcessProperties As New ProcessStartInfo ProcessProperties. FileName 64 34notepad34 ProcessProperties. Arguments 61 34myTextFile. txt34 ProcessProperties. WindowStyle 61 ProcessWindowStyle. Maximized Dim myProcess Process ProcessStart (ProcessProperties) Continuer la lecture ci dessous Vous pouvez même démarrer un processus masqué. ProcessProperties. WindowStyle 61 ProcessWindowStyle. Hidden Mais soyez prudent. Sauf si vous ajoutez plus de code pour terminer le processus, vous devrez probablement le terminer dans le Gestionnaire des tâches. Les processus cachés ne sont normalement utilisés qu'avec des processus qui ne possèdent aucune interface utilisateur. Travailler avec Process. Start comme un objet vous donne beaucoup de capacités. Par exemple, vous pouvez récupérer le nom du processus qui a été démarré. Ce code affichera 34notepad34 dans la fenêtre Sortie: Dim myProcess As Process 61 Process. Start (34MyTextFile. txt34) Console. WriteLine (myProcess. ProcessName) Si vous devez suspendre l'exécution de votre programme jusqu'à ce que le processus soit terminé (quelque chose que vous pourriez faire Avec le code API dans VB6), voilà. Console. WriteLine (34Notepad terminé: 34 amp myProcess. ExitTime amp Environnement. NewLine amp 34Exit Code: 34 amp myProcess. ExitCode) Cela était quelque chose que vous ne pouviez pas faire avec la commande VB6 Shell, car il a lancé la nouvelle application de façon asynchrone. Utilisation de WaitForExit peut provoquer le problème inverse dans parce que vous devez lancer un processus dans un nouveau thread si vous avez besoin pour exécuter de façon asynchrone. Par exemple, si vous avez besoin que les composants restent actifs dans un formulaire où un processus a été lancé et WaitForExit a été exécuté. Habituellement, ces composants ne seront pas actifs. Code it up et de voir par vous même. Une façon de forcer le processus à arrêter est d'utiliser la méthode Kill. Ce code attend 10 secondes, puis termine le processus. J'ai constaté qu'un délai forcé était nécessaire pour permettre au processus de se terminer pour éviter une erreur. MyProcess. WaitForExit (10000) 39 si le processus ne se termine pas en 39 10 secondes, tuez le Si non myProcess. HasExited Puis myProcess. Kill () End If Threading. Thread. Sleep (1) Console. WriteLine (34Notepad terminé: 34 amp myProcess. ExitTime amp Environment. NewLine amp 34Exit Code: 34 amp myProcess. ExitCode) Dans la plupart des cas, il est probablement une bonne idée de mettre votre traitement dans un bloc d'utilisation pour s'assurer que les ressources utilisées par le processus sont libérées. Utilisation de myProcess As Process 61 Nouveau processus 39 Votre code est utilisé ici Fin Utilisation Pour rendre tout cela encore plus facile à utiliser, il ya même un composant Process que vous pouvez ajouter à votre projet afin que vous puissiez faire beaucoup de choses ci dessus à la conception Temps au lieu du temps d'exécution. Une des choses que cela rend beaucoup plus facile est de coder les événements soulevés par le processus, comme l'événement lorsque le processus a quitté. Vous pouvez également ajouter un gestionnaire en utilisant un code comme celui ci. 39 autoriser le processus à émettre des événements myProcess. EnableRaisingEvents 61 True 39 ajouter un gestionnaire d'événement Exited AddHandler myProcess. Exited, AddressOf Me. ProcessExited Private Sub ProcessExited (ByVal expéditeur comme objet, ByVal e comme System. EventArgs) 39 Votre code va ici End Sub Mais il suffit de sélectionner l'événement pour le composant est beaucoup plus facile. Il m'a semblé que ce système asynchrony était une solution glorieuse à un problème Ive été d'avoir où je dois démarrer un processus externe, puis attendre qu'il soit terminé. Le processus prend souvent plusieurs secondes, mais Ive résisté à l'aide d'un travailleur d'arrière plan ou similaire, car il ne se passe tout simplement pas souvent Assez pour être la peine de l'effort et coder brouillage. J'ai vu la mention des méthodes d'extension dans le livre blanc, mais il semble y avoir aucune méthode d'extension pour process. RunAsync () ou quelque chose de semblable, laissant quotaWait TaskEx. Run (() gt process. WaitForExit ()) quot comme la seule solution qui semble Comme itll travail. Spinning jusqu'à un fil supplémentaire juste pour appeler WaitForExit semble assez stupide. J'ai également trouvé aucune méthode statique qui semblait prometteuse dans AsyncCtpExtensions, AsyncCtpThreadingExtensions, TaskEx ou TaskExtensions. Y at il une meilleure façon (prévue) d'attendre l'achèvement du processus externe L'inconvénient à l'utilisation de la piscine de cette manière est que vous bloquez un thread pour la durée du processus. Si vous ne tournez pas vers le haut de beaucoup de processus, ceci ne peut pas être un problème énorme, mais theres encore aucun besoin réel de le faire. Au lieu de cela, vous pouvez utiliser une tâche qui n'est pas liée à un thread, p. Tcs. TrySetResult (null) if (p. HasExited) tcs. TrySetResult (null) retourne tcs. Task Avec cela, Vous pouvez écrire: et vous ne bloquez pas les threads tout en attendant le processus de façon asynchrone. Proposé comme réponse par Stephen Toub MSFT Employé de Microsoft, Modérateur vendredi 29 octobre 2010 21h29 Marqué comme réponse par Lucian Wischik, MSFT Employé de Microsoft, Propriétaire samedi, 30 octobre 2010 22h13 vendredi 29 octobre 2010 9:28 PM quot Spinning jusqu'à un fil supplémentaire juste pour appeler WaitForExit semble plutôt stupide. Si vous utilisez la fonctionnalité standard TPL, par défaut, itll utiliser un thread ThreadPool. Il ne devrait vraiment pas y avoir beaucoup de temps d'attente pour quotspin upquot le fil. Puisque ceci est quelque chose qui ne se produit pas assez souvent pour valoir la peine l'effort et le code scramblingquot, Id juste l'utilisation: Reed Copsey, Jr. reedcopsey Si un message répond à votre question, s'il vous plaît cliquez quot Mark As Answer quot sur ce post et quot Marquer comme utile. Friday, October 29, 2010 7:30 PM L'inconvénient à l'utilisation de la piscine de cette manière est que vous bloquez un thread pour la durée du processus. Si vous ne tournez pas vers le haut de beaucoup de processus, ceci ne peut pas être un problème énorme, mais theres encore aucun besoin réel de le faire. Au lieu de cela, vous pouvez utiliser une tâche qui n'est pas liée à un thread, p. Tcs. TrySetResult (null) if (p. HasExited) tcs. TrySetResult (null) retourne tcs. Task Avec cela, Vous pouvez écrire: et vous ne bloquez pas les threads tout en attendant le processus de façon asynchrone. Proposé comme réponse par Stephen Toub MSFT Employé de Microsoft, Modérateur vendredi 29 octobre 2010 21h29 Marqué comme réponse par Lucian Wischik, MSFT Employé de Microsoft, Propriétaire samedi, 30 octobre 2010 22h13 vendredi 29 octobre 2010 21 h 28
No comments:
Post a Comment