2011-07-11 17 views
0

我試圖寫,其利用組合框以顯示從以下方法獲得的當前連接COM端口的程序:添加/ C#中從ComboBox卸下COM端口

System.IO.Ports.SerialPort.GetPortNames() 

的想法是來初始化線程每秒鐘檢查當前可用的COM端口,並相應地更新組合框。儘管我盡了最大努力,但我無法實現它的目標。

的代碼更新組合框的內容如下:

private void Form1_Load(object sender, EventArgs e) 
    { 
     availPorts = new BindingList<String>(); 

     Thread t = new Thread(new ThreadStart(update)); 
     t.Start(); 
    } 

    private void update() 
    { 
     this.comboBox1.DataSource = availPorts; 

     while (true) 
     { 
      Console.WriteLine("CHECK"); 

      foreach (String port in System.IO.Ports.SerialPort.GetPortNames()) 
      { 
       if (!availPorts.Contains(port)) 
       { 
        Console.WriteLine("FOUND"); 
        availPorts.Add(port); 
       } 
      } 

      Thread.Sleep(1000); 
     } 
    } 

我可以看到控制檯消息的端口被發現,但組合框保留爲空。任何幫助將不勝感激。

+0

您是否將availPorts與ComboBox綁定? – longbkit

+0

'this.comboBox1.DataSource = availPorts;' 這不是綁定語句嗎? – isometrik

+0

當您在Load事件中創建一個新的時不會。 –

回答

0

ComboBox沒有被更新,因爲創建的運行更新方法的線程試圖更新屬於另一個線程的可視控件。在大多數情況下,這會引發錯誤,但是在這裏不會。

我通過首先創建一個獨立於更新的方法來解決此問題,該方法只處理向數據源添加COM端口名稱。在這個方法中是一個if語句是否需要調用檢查:

private void addPort(String port) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new addPortDelegate(addPort), port); 
     } 
     else 
     { 
      availablePorts.Add(port); 
      Console.WriteLine("FOUND"); 
     } 
    } 

如果需要調用,該方法被調用正確的線程中通過委託:

private delegate void addPortDelegate(String s); 

這導致ComboBox在更新方法的連續執行中檢測到新的COM端口時更新。可以編寫一個類似的方法來刪除已從系統斷開的COM端口。當表單關閉時不要忘記結束線程,否則它將無限旋轉。

0

嘗試修改代碼。

BindingList<String> availPorts = new BindingList<String>(); 
AutoResetEvent autoResetEvent = new AutoResetEvent(false); 
private void Form1_Load(object sender, EventArgs e) 
{ 

    Thread t = new Thread(new ThreadStart(update)); 
    t.Start(); 
    autoResetEvent.WaitOne(); 
    this.comboBox1.DataSource = availPorts; 
} 

private void update() 
{ 
    //this.comboBox1.DataSource = availPorts; 

    while (true) 
    { 
     Console.WriteLine("CHECK"); 

     foreach (String port in System.IO.Ports.SerialPort.GetPortNames()) 
     { 
      if (!availPorts.Contains(port)) 
      { 
       Console.WriteLine("FOUND"); 
       availPorts.Add(port); 
      } 
     } 

     autoResetEvent.Set(); 
    } 
} 
+0

如果我在添加睡眠語句的情況下使用此代碼,它仍然無法正常工作。如果我開始使用已連接的COM端口進行調試,那麼它將在ComboBox中被檢測到並顯示爲一個項目,但是如果我開始調試時沒有連接COM端口並繼續插入,控制檯消息顯示「FOUND」,但不顯示項目出現在組合框中。 – isometrik

+0

我沒有得到問題:( – Anuraj