Необходимо выполнить множество строк бесконечно в C # - PullRequest
0 голосов
/ 27 июня 2011

Что я хочу сделать - это бесконечно записывать в последовательный порт до тех пор, пока не будет нажата определенная клавиша (скажем, «Enter»). Со всеми полученными результатами поиска можно выполнять только набор команд В цикле, но не передавать управление. Но моя проблема немного другая. Я выдаю запись в последовательный порт в форме загрузки. Как только команда отправлена, GPS выдает некоторые данные, которые мне нужно прочитать. Я прочитал это с помощью события serialPort_DataReceived. Так что, если я запускаю программу один раз, все идет по плану. Но если я попытаюсь поместить какой-либо из циклов, представленных на многих сайтах, таких как, while (true) {} или if (;;) {} или используя consolekey, я не смогу передать управление из этого конкретного цикла в полученные данные событие последовательного порта, и, следовательно, не может прослушивать входящие данные на последовательном порту.

Итак, мне нужно записать в последовательный порт, прослушать входящие данные, запустить мой алгоритм для обновления формы, а затем вернуться к первому циклу; и повторяйте всю последовательность, пока не будет нажата клавиша.

Любая помощь будет оценена.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

Вам нужно использовать многопоточность, чтобы иметь эти бесконечные циклы.Запустите поток background worker для чтения ваших данных.

Затем вы можете либо обработать данные в вашем пользовательском интерфейсе (если он прост), либо использовать другой поток для сбора данных по мере их поступления.и обработайте его.

Другой пример: здесь

0 голосов
/ 27 июня 2011

Вы можете просто использовать BackgroundWorker или класс Thread. Имейте в виду, что каждый поток может напрямую вызывать методы только своих собственных элементов управления WinForms. Если вы хотите избежать межпотоковых исключений, вам нужно использовать метод Invoke. Для получения более подробной информации и образцов перейдите по адресу: http://geekswithblogs.net/DrissZouakBlog/archive/2006/06/20/82513.aspx

образец:

BackgroundWorker bw = new BackgroundWorker();

bw.DoWork += (x,y)  
    => 
    {
        while (true)
        {
            if (checkCondition)
            {
                // do sth here -> for example refresh control or 
                this.Invoke(updateUI, new object[] { args }); // // now ‘schedule’ the update for when the Winform (i.e. this) is able to by calling
                break; // if the job is done and you want to terminate the thread
            }
            // maybe put some Sleep here Thread.Sleep(5);
        }
    };

bw.RunWorkerCompleted += (x, y) => // not mandatory!
    {
        // sth
    };

bw.RunWorkerAsync(); // start 
0 голосов
/ 27 июня 2011

Учебник по потокам:

http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

или Google "Учебник по потокам c #"

Хороший предыдущий вопрос:

https://stackoverflow.com/questions/177488/c-threading

...