2016-06-11 3 views
1

ルータの機能(パケットのスウィッチなど)をシミュレートするコンソールアプリケーションがあります。私は各ルータのソケットがどれくらい使われているかを示す簡単なWindowsフォームを作った。各ソケットは異なる容量を持ち、各フォームはソケットに「接続」されていれば、どれくらいの容量が残っているかを示す必要があります。c#コンソールからWindowsフォームを実行し、両方を実行する

これまでの私のコード:今すぐ

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]); 
     } 

、LRMは、各ソケットの(または、より正確に、リンクのソケットに取り付けられている)状態を示しWinフォームであるので、私はそれを初期化し、それをパラメータ与えます。

  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とWriteAvailableは、そのようなLRM上の値を更新するために、ルータによって呼び出されるメソッド、以下のとおりです。今

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

、私が持っている現在の問題:

1)複数のWindowsフォームを実行しますウィンドウの数が変化する(コマンドライン引数で設定される)ときにコンソールから取得し、その機能を維持する(すべて同時に)。

2)Updatin g LRM値。 show()メソッドを使用すると、フォームだけが表示され、値は与えられず、フォームの応答が遅れてすぐにウィンドウエラーが表示されます。 Application.Run()メソッドを使用すると、1つのフォームがうまく動作しますが、他のLRMもルータのコンソールも機能しません。

+0

ソケット情報を表示するには、単一のフォームと 'DataGridView'や' ListView'のようなコントロールを使います。 –

答えて

-1

私はAlexander Petrovの答えに感謝しますが、私は自分の問題を解決する方法を見つけました。

スレッドアプローチを試しました。まず私は、静的私の変数のほとんどを作った:

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

その後、私は方法

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(); 
    } 

を開始するスレッドとして動作される方法を作った後、main()メソッドでは、私はリンクのリソースマネージャのためのメモリを割り当てられます、forループでは、必要な数のLRMを作成しました。

 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); 
     } 

睡眠は実際には必要ではありません。理由がわからないのは、そこにいないときにエラーが発生したからです。

最後に、何が起こっているかを示すコンソールアプリケーションと、うまくいく方法でいくつかの値を表示するWindowsフォームはほとんどありません。

関連する問題