Добавление / удаление COM-портов из ComboBox в C # - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь написать программу, которая использует ComboBox для отображения текущих подключенных COM-портов, полученных с помощью следующего метода:

System.IO.Ports.SerialPort.GetPortNames()

Идея состоит в том, чтобы инициализировать поток, который проверяет текущие доступные COM-порты каждыйво-вторых, и обновите ComboBox соответственно.Несмотря на все мои усилия, я не могу заставить его работать.

Код для обновления содержимого ComboBox следующий:

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

Я вижу сообщения консоли, поскольку портынайдено, однако ComboBox остается пустым.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

ComboBox не обновляется, поскольку поток, созданный для запуска метода обновления, пытается обновить визуальный элемент управления, принадлежащий другому потоку. В большинстве случаев это приведет к ошибке, однако здесь это не так.

Я решил эту проблему, сначала создав метод, отдельный от update, который обрабатывает только добавление имен 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 голосов
/ 11 июля 2011

Попробуйте изменить код следующим образом.

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