2013-11-15 4 views
-2

Я прочитал десятки статей о потоковом в C# и приложении.DoEvents() ... Все еще не могу использовать его правильно, чтобы выполнить мою задачу: У меня есть контроллер, подключенный к мой COM, этот контроллер работает по команде (я отправить команду, нужно ждать несколько миллисекунд, чтобы получить ответ от него), предположит ответ является данными, которые я хочу построить каждый интервал времени с помощью цикла:многопоточное безопасное использование с контроллером SerialPort

  • начала моя петля.
  • отправить команду контроллеру через serialPort.
    • wait for response (wait let say 20 ms).
    • получить данные.
  • повторите этот цикл каждый, скажем, 100 мс.

это просто не хочет работать !! Я попытался связаться с контроллером данных в другом потоке, но кажется, что он не может получить доступ к serialPort, который принадлежит основному потоку (грубо говоря).

любая помощь ценится

+4

По моему опыту, «DoEvents» никогда не решал никаких проблем. Я стараюсь держаться подальше от него. – gunr2171

+0

что вы используете тогда в таких случаях, когда вам это нужно, можете ли вы, пожалуйста, дать мне альтернативу, которую вы предпочитаете? К gunr2171 – chouaib

+0

Создайте экземпляр serialPort во вторичном потоке, используйте его и управляйте им. Сообщайте данные своего участка с помощью BeginInvoke. –

ответ

2

Application.DoEvents для всего это делает - не более, чем вложенная вызов на окна (низкая уровень) в одном потоке. Это может привести к рекурсии, если вы вызовете ее в обработчике событий. Вы можете подумать о создании объекта последовательного порта в рабочем потоке и обмениваться данными через классы потоков (т. Е. WaitHandles и т. Д.). Или перезвоните в свой поток пользовательского интерфейса, используя «BeginInvoke» и «EndInvoke» в объекте пользовательского интерфейса.

+0

Да, они говорят, что в 3-м звене, которое я написал :) +1, тем не менее, хороший сер ... – Noctis

+0

Спасибо, мы накладывались. Но в качестве неместного оратора эти ответы занимают еще несколько секунд, чтобы набирать ... по крайней мере, без лишних опечаток :) –

+0

+1 - как раз о идеальном ответе. –

-1

Почему вы используете его, чтобы начать?

Посмотрите на этих страницах, это может дать вам направление

  1. Мой любимый: Is DoEvents Evil?
  2. Из MSDN блога Keeping your UI Responsive and the Dangers of Application.DoEvents
  3. От форумах MSDN Application does not return from call to DoEvents

Без кода, это будет трудно помочь. Даже с кодом, это может быть трудно, чтобы помочь :)

Я согласен с gunr2171 на этом :)

+0

Я бы сказал, что это ответ только для ссылок, но одна из ссылок - Coding Horror, сайт, который никогда не умрет. – gunr2171

+0

Я бы сказал, что этот вопрос слишком широк, и пользователь даже не показал, что он пробовал ...Так что ... проделать некоторое чтение и показать, что он заботится :) – Noctis

0

Если вы поймаете событие SerialPort.DataReceived, а затем используйте wither SerialPort.ReadLine или SerialPort.Read (byte [], int, int), эти методы будут выполняться в новом потоке. Я предпочитаю использовать мьютекс для управления доступом к буферу байтов в качестве общего ресурса. Также вы когда-нибудь общались с вашим устройством успешно? Если в дополнение к настройке порта не проверяется свойство SerialPort.NewLine и свойство SerialPort.Handshake. Эти настройки зависят от устройства, с которым вы пытаетесь установить связь.

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