2010-12-02 16 views
2

Alors je lance un groupe de processus pour convertir des fichiers audio et je veux que mon programme principal d'attendre jusqu'à ce que tous les processus complet avant d'exécuter.Comment attendre jusqu'à ce qu'un processus se termine avant de continuer à exécuter - C#

 System.Diagnostics.Process process = new System.Diagnostics.Process(); 
     System.Diagnostics.ProcessStartInfo stratInfo = new System.Diagnostics.ProcessStartInfo(); 
     stratInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     DirectoryInfo di = new DirectoryInfo(@dir); 
     foreach (FileInfo fi in di.GetFiles()) 
      { 
       stratInfo.FileName = "C:\\AudioExtract.exe"; 
       stratInfo.Arguments = "-a \"" + dir + "\\" + fi.Name + "\""; 
       process.StartInfo = stratInfo; 
       process.Start(); 
      } 
       foreach (Process clsProcess in Process.GetProcesses()) 
       { 
        if (clsProcess.ProcessName.Contains("AudioExtract.exe")) 
        { 
         StatusLbl.Text = "Found!"; 
        } 
       } 

Thats ce que je dois voir si elle est en cours d'exécution, mais je dois continuer à mettre à jour les GetProcesses et vérifier si elle est toujours en cours d'exécution et je ne suis pas tout à fait sûr de savoir comment.

Mon application lance Beaucoup du même processus pour les différents fichiers audio, presque simultanément. J'ai regardé le lien dans le commentaire et cela va mettre en place un gestionnaire d'événements, comment pourrais-je gérer beaucoup du même événement chaque fois que l'un des processus de sortie?

+1

http://stackoverflow.com/questions/2/how-to-know-the-exe-run par mes-applications processus a-complété son-travail/4332123 # 4332123 –

+0

mis à jour mon post – Dacto

Répondre

3

dans le cas, essayez

pprocess.WaitForExit(); 
break; 

http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx

que le code attendra que les sorties de processus, puis rompre votre foreach permettant à votre programme principal de continuer à fonctionner.

+0

habitude cet arrêt mon programme?En outre, les données initiales de getprocesses ne restent pas précises, car les autres processus sont en cours d'achèvement? – Dacto

+0

Cela arrêtera votre programme, mais n'est-ce pas ce que vous demandiez? Vous dites que vous lancez plusieurs "AudioExtract.exe"? Si c'est le cas, ne cassez pas. Faire un appel de méthode à votre programme principal. Lorsque votre programme principal est terminé, foreach continue jusqu'à ce qu'il trouve un autre "AudioExtract.exe", attendez jusqu'à ce qu'il se termine, puis il peut appeler à nouveau la méthode principale. Je ne suis pas exactement sûr de ce que tu veux. J'espère que j'aide au moins. – seekerOfKnowledge

+0

comment vais-je pour chacun continuer à les trouver? le foreach exécute seulement les processus une fois – Dacto

3

Il y a quelques problèmes qui rendront votre code pratiquement inutilisable, s'il vous plaît nu avec moi:

  1. Firing autant de processus que vous avez des fichiers - gros no-no. Vous allez encombrer votre CPU et vous obtiendrez tous les avantages de votre machine super multicore après tout. Règle de base: jusqu'à 2 processus par cœur. Cela va chauffer um le processeur très bien.
  2. Fragmentation du disque. Ecrire sur 100 fichiers à la fois laissera votre disque dur si fragmenté, vous l'aurez étouffé en un rien de temps.
  3. Réutilisation Objet de processus: encore une fois, mauvaise chose. Si vous le souhaitez: créez une instance de processus dans une boucle et stockez-la dans une sorte de liste. Si vous tenez vraiment à l'idée de «courir en une fois», lancez-les, stockez-les dans une liste, puis parcourez la liste et attendez que chacun d'eux se termine!
  4. Créer des processus demandant alors la liste des processus du système et les recherche par nom - pourquoi quand vous les avez créées en premier lieu?

EDIT:

Comment vous pouvez le faire:

  • enquête sur le nombre de cœurs CPU que vous avez
  • créer une matrice deux fois plus grand
  • en boucle foreach, procédez comme suit:
    • déterminer si vous avez dans votre tableau (l'un des processus est nul)
    • le cas échéant - Créer un nouveau processus, le mettre dans le tableau
    • si non, boucle: vérifier (sans blocage) si l'un de vos processus est terminé; premier qui est fixé à null (à l'intérieur du tableau) - si aucune ne fait, dormir un peu (mon chiffre magique est de 350 - vous choisissez votre propre)