2016-06-11 4 views
1

라우터 기능 (패킷 스윙 등)을 시뮬레이트하는 콘솔 응용 프로그램이 있습니다. 나는 각 라우터의 소켓이 얼마나 많이 사용되는지를 보여주는 간단한 Windows Form을 만들었다. 각 소켓은 용량이 다르고 소켓에 "연결"된 각 양식에는 용량을 표시해야합니다. 지금까지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은 각 소켓 (또는, 더 정확하게, 링크의 소켓에 부착 된) 상태를 표시하는의 WinForm, 그래서 나는 그것을 초기화하고 매개 변수 제공합니다.

  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) 여러 창 양식을 실행 콘솔에서 가져오고 기능을 유지 (모두 동시에), 창 형식 수가 다를 때 (명령 줄 인수로 설정)

2) Updatin g LRM 값. show() 메소드를 사용할 때 폼을 표시하고, 값을주지 않으며, 폼이 응답을 멈추자 마자 windows 오류가 발생합니다. Application.Run() 메서드를 사용하면 한 양식이 잘 실행되지만 다른 LRM이나 라우터 콘솔은 작동하지 않습니다.

+0

소켓 정보를 표시하려면 'DataGridView'또는 'ListView'와 같은 단일 폼과 컨트롤을 사용하십시오. –

답변

-1

알렉산더 페트 로프의 대답에 감사 드리며, 문제를 해결할 수있는 방법을 찾았습니다.

시도해 보았습니다. 우선 정적 내 변수의 대부분을 만들어 :

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

그때 내가 main() 메소드에서,

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

그런 다음 스레드 시작하는 방법으로 행동 할 것입니다 방법을 만들어, 내가 링크 자원 관리자를위한 메모리를 할당 , 그리고 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); 
     } 

사실 알려지지 않은 이유 때문에 거기에 없었을 때 오류가 발생했기 때문에 실제로자는 것이 필요했습니다.

마지막으로 콘솔 응용 프로그램에서 무슨 일이 일어나고 있는지, 몇 가지 창에서는 좋은 방식으로 어떤 값을 표시합니다.

관련 문제