6
votes

Exécuter un autre processus sans interface graphique

J'ai des difficultés à faire apparaître mon interface graphique et ne pas congeler tout en courant (et en attendant) un processus extérieur. Dans ce cas, drivers.exe est un programme très simplement sur lequel l'utilisateur clique simplement sur "OK". Donc, chaque fois que je clique sur OK, il sort. J'essaie de simplement faire mes numéros de stockage de Statut Strip (vraiment rapide) en tant que drivers.exe exécute. Mais dans la pratique, mon interface graphique n'apparaît jamais du tout avant les drivers.exe. XXX


0 commentaires

4 Réponses :


3
votes

Vous devez regarder dans un Backworker , Comme tout le travail de filetage pour vous


2 commentaires

Pourriez-vous s'il vous plaît me montrer comment? Je lui ai donné un coup de feu et ça n'a vraiment pas marché du tout. Ma forme ne montrerait toujours pas ... du tout, en fait.


Le problème est la boucle "Alors que (T.ISALIVE)". Il a besoin de l'obtenir hors du fil de l'interface utilisateur s'il utilise un travail d'arrière-plan ou non.



2
votes

La raison pour laquelle votre formulaire ne montre pas avant que driver.exe a été exécuté, c'est parce que vous exécutez des drivers.exe à partir de form.load . Form.Load se produit avant l'affichage du formulaire. Essayez d'exécuter des drivers.exe dans formul.shown à la place.

Aussi, tandis que (t.isalive) bloquera techniquement votre fil d'interface utilisateur. Si ce n'est pas ce que vous voulez, il devrait être déplacé du fil principal. Vous voudrez probablement probablement appeler ToolstripstatusLabel1.refresh () Pour forcer l'étiquette à rafraîchir après avoir défini son texte.


1 commentaires

Si le code est exécuté dans la forme ou la version ultérieure, le thread de l'interface utilisateur ne sera toujours pas le temps de peindre l'écran lorsqu'il est exécuté comme indiqué.



0
votes

Ne mettez aucune boucle sur le fil de l'interface graphique. Il gèlera votre application. La boucle doit être sur le fil d'arrière-plan qui devrait mettre à jour toolstripstatuslabel1 via invoquer méthode.

Voir cet exemple. non testé. Peut-être que cela pourrait même fonctionner comme ceci ... xxx


2 commentaires

D'accord, ça a du sens. Mais comment puis-je attendre d'exécuter une fonction jusqu'à ce que l'autre soit terminée? Par exemple, disons que je veux exécuter Func_2 uniquement après que Func_2 soit terminé, qui prendra toutes deux plusieurs minutes à compléter.


Démarrez un nouveau thread sur la dernière ligne de Run_Divers () méthode. Il suffit de rester à l'écart des boucles sur le fil de l'interface graphique.



0
votes

Une solution que vous pouvez utiliser, tout en conservant votre structure de code actuelle, consiste à mettre à jour l'interface utilisateur périodiquement sur un TIMER , arrêtez la minuterie lorsque le fil est terminé. Fais cela, vous allez passer d'une boucle à un design axé sur les événements, et vous donnerez le temps de fil de l'interface utilisateur pour peindre votre formulaire.

// create a System.Windows.Forms.Timer through the designer or in code.
// give it a short interval if you want the counter to increment quickly.

int counter;

private void Form1_Load(object sender, EventArgs e)
{
    ...
    t.Start();
    counter = 0;
    timer.Start();
    ....
}

private void timer_Tick(object sender, EventArgs e)
{
   if (t.IsAlive)
   {
       counter++;
       toolStripStatusLabel1.Text = counter.ToString(); 
   }
   else
   {
      timer.Stop();
   }
}


0 commentaires