2016-06-11 1 views
1

Il existe une application console qui simule la fonctionnalité du routeur (contournement des paquets, etc.). J'ai fait un simple Windows Form qui devrait montrer combien la socket de chaque routeur est utilisée. Chaque socket a une capacité différente et chaque forme "connectée" à la socket doit montrer combien de capacité est encore disponible.C# Exécuter des fenêtres à partir de la console et exécuter les deux

Mon code à ce jour:

static void Main(string[] args) 
     { 
     //get number of router's sockets 
     args = Environment.GetCommandLineArgs(); 
     int socketnumber = Convert.ToInt32(args[2]); 
     //get sockets' capacity 
     int[] array = new int[socketnumber]; 
     for (int i = 0; i < socketnumber; i++) 
     { 
      array[i] = Convert.ToInt32(args[3 + i]); 
     } 

Maintenant, LRM est un WinForm qui montre l'état de chaque prise (ou, plus exactement, attaché à la prise de lien), donc je l'initialiser et de lui donner des paramètres.

  LRM[] lrm = new LRM[socketnumber]; 

      for (int i = 0; i < socketnumber; i++) 
      { 
       lrm[i] = new LRM(); 
       lrm[i].Show(); 
       a++; 
      } 

      for (int i = 0; i < socketnumber; i++) 
      { 
       Console.WriteLine(array[i]); 
       lrm[i].capacity = array[i]; 
       lrm[i].available = array[i]; 
       lrm[i].WriteCapacity(lrm[i].capacity); 
       lrm[i].WriteAvailable(lrm[i].available); 
      } 

WriteCapacity et WriteAvailable sont des méthodes qui sont invoquées par le routeur de mettre à jour les valeurs sur LRM, comme ça:

public void WriteAvailable(int ava) 
    { 
    MethodInvoker mi = delegate() 
     { 
     textBox2.Text = ava.ToString(); 
     }; 
    Invoke(mi); 
    } 

Maintenant, les problèmes actuels que j'ai:

1) L'exécution de plusieurs fenêtres formes à partir de la console ET maintien de leur fonctionnalité (tous simultanément), lorsque le nombre de formulaires Windows varie (est défini par l'argument de la ligne de commande)

2) Updatin g les valeurs LRM. Lors de l'utilisation de la méthode show(), il affiche simplement le formulaire, il ne lui donne aucune valeur et, peu de temps après, le formulaire s'arrête pour répondre, ce qui donne une erreur à Windows. Lorsque vous utilisez la méthode Application.Run(), un formulaire s'exécute bien, mais ni les autres LRM ni la console du routeur ne fonctionnent.

+0

Utilisez une forme unique et un contrôle comme 'DataGridView' ou' ListView' pour afficher les informations sur les sockets. –

Répondre

-1

J'apprécie la réponse d'Alexander Petrov, mais j'ai trouvé un moyen de résoudre mon problème.

J'ai essayé l'approche par le fil. D'abord, je fait la plupart de mes variables statiques:

static int[] array; 
    static LRM[] lrm; 
    static int port; 

alors je fait méthode qui agira en tant que mode de démarrage du fil

private static void startLRM(int i) 
    { 
     Console.WriteLine(i); 
     lrm[i].Text = "LRM R" + ((port/10) - 120).ToString() + " S" + a.ToString(); 
     a++; 

     Console.WriteLine(array[i]); 
     lrm[i].capacity = array[i]; 
     lrm[i].available = array[i]; 
     lrm[i].WriteCapacity(lrm[i].capacity); 
     lrm[i].WriteAvailable(lrm[i].available); 
     lrm[i].ShowDialog(); 
    } 

Puis, dans la méthode Main(), je la mémoire allouée aux gestionnaires des ressources de lien , et dans la boucle j'ai fait autant de LRM que nécessaire.

 lrm = new LRM[socketnumber]; 

     for (int i = 0; i < socketnumber; i++) 
     { 
     lrm[i] = new LRM(); 
     Thread thread = new Thread(() => startLRM(i)); 
     thread.Start(); 
     Thread.Sleep(150); 
     } 

Dormir était vraiment nécessaire, parce que, pour des raisons inconnues me donnent des erreurs quand il était pas là.

Enfin, j'obtiens ce dont j'avais besoin - une application de console, qui montre ce qui se passe, et quelques fenêtres qui montrent de manière agréable certaines valeurs.