Потоки обмена данными в C ++ - PullRequest
0 голосов
/ 06 марта 2012

У меня есть GUI-поток, которому нужна информация из другого потока (IO-потока).IO-поток, все, что он делает, получает информацию из последовательного порта.Gui Thread все, что он делает - читает информацию о выборках и отображает их в виде таблицы.

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

Теперь я знаю, что получу ответ, говорящий, почему вы не используете только поток GUI для извлечения данных ввода-вывода, поэтому я выиграл 'многопоточность не нужнаДа, я знаю, что просто пытаюсь привести простой пример для изучения лучших практик:)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Один из способов сделать это - позволить вашему потоку ввода-вывода опубликовать входные данные в GUI. Всякий раз, когда вы получаете данные в своем потоке ввода-вывода, вы упаковываете их в структуру в куче и публикуете пользовательское сообщение вместе с адресом структуры обратно в поток графического интерфейса. IOW вы создаете поток GUI, а затем поток IO, передавая дескриптор потока GUI потоку IO, который будет использоваться для отправки данных обратно в GUI. Таким образом, вам не нужно заботиться о мьютексе / критической секции, но вы либо используете существующую очередь сообщений графического интерфейса, либо создаете свою собственную в зависимости от среды, в которой предполагается запускать ваш проект.

1 голос
/ 06 марта 2012

Я предлагаю два разных экземпляра одной и той же структуры.Когда ваш поток ввода-вывода готов к обновлению потока GUI, он захватывает мьютекс, копирует свою структуру в структуру потока GUI, разблокирует мьютекс и уведомляет поток GUI о том, что он должен прочитать обновленную копию структуры.

Что касается вашего критического раздела, то это просто относится к концепции наличия разделов кода, которые одновременно может выполнять только один раздел.Главным образом потому, что в противном случае вы могли бы получить противоречивое состояние.Способ создания критического раздела заключается в том, что он связывается с блокирующим мьютексом и разблокирующим мьютексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...