2013-08-05 4 views
0

Я разрабатываю приложение WPF, которое будет считывать данные на последовательном порту, анализировать его и отображать в пользовательском интерфейсе.UI зависает при чтении данных на последовательном порту

я должен использовать последовательный порт Buad скорость - 115200, биты данных - 8, Стоп бит - 1.

Я посылаю 10000 байт в секунду на последовательный порт, который будет читать мой WPF приложения.

Но, здесь я сталкиваюсь с проблемой с пользовательским интерфейсом. Когда я начинаю читать COM-порт, мой пользовательский интерфейс замерзает. Это не позволяет никому ничего делать. Согласно моему исследованию, это связано с высокой скоростью данных.

  1. Я читаю COM-порт в разных потоках, и пользовательский интерфейс работает на разных потоках.
  2. Передача данных между потоками осуществляется с использованием общего кругового буфера.
  3. Я использовал методы BeginInvoke для обновления полей пользовательского интерфейса, поэтому функция немедленно возвращает результат.
  4. Я использовал механизм блокировки при доступе к круговому буфере в обоих потоках.

Есть ли способ справиться с этой ситуацией? Я читал, что многие люди сталкиваются с такой же проблемой. Каково решение, с помощью которого такая проблема может быть решена.

Спасибо, Вишал N

+1

Просьба указать код. – Diryboy

+0

Ты уверен, что вы в разные темы? Ваш порт прочитал конец? Отправьте код, пожалуйста. – Sonhja

+1

Шаг 3 - проблема, вы делаете это слишком часто. Пользовательский интерфейс не может идти в ногу. Просто делайте это * много * реже, вам нужно только держать человеческие глаза занятыми. Они не могут видеть ничего, что обновляется быстрее, чем 20 раз в секунду. Буферизуйте полученные данные, пока не получите полный ответ. И свести к минимуму количество информации, которую вы сбрасываете в пользовательском интерфейсе. –

ответ

0

Это звучит так, как будто вы либо настроить свой Thread объект (ы) неправильно, или вы передаете обратную связь назад к UI слишком часто.

Если вам неловко работать с объектами Thread, возможно, класс BackgroundWorker может вам помочь. Проверьте страницу BackgroundWorker Class в MSDN.