2016-06-11 1 views
1

Существует консольное приложение, которое имитирует функциональность маршрутизатора (пакетное перемещение и т. Д.). Я сделал простую форму Windows, которая должна показать, насколько используется каждый сокет маршрутизатора. Каждый сокет имеет разную емкость, и каждая форма «подключена» к гнезду должна показывать, какая емкость еще доступна.C# запускает оконную форму с консоли и запускает их оба

Мой код до сих пор:

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; 

Затем я сделал метод, который будет действовать в качестве потока исходного метода

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() метод, я выделил память для менеджеров ссылки ресурсов , а в цикле я сделал столько 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); 
     } 

Сон на самом деле был необходим, потому что по неизвестным причинам я получил ошибки, когда его там не было.

Наконец, я получаю то, что мне нужно - консольное приложение, которое показывает, что происходит, и несколько форм окон, которые показывают в хорошем смысле некоторые значения.

Смежные вопросы