помощь в смешивании рисования виджетов и передачи данных UDP в многопоточном контексте - PullRequest
1 голос
/ 23 февраля 2010

Вот что мне нужно сделать.

-Я получаю данные журнала через соединение udp -Я складываю соответствующие данные в qlist -У меня есть таймер, работающий в главном потоке, который по таймауту распаковывает эти данные, обновляет некоторые массивы, затем вызывает widget-> update -Виджет повторно реализует paintEvent и использует эти массивы для рисования диаграмм.

Какой лучший способ сделать это, чтобы не было ошибок.

Эта задача состоит в основном из трех процессов, два из которых выполняются в основном потоке

1-У меня есть qthread, который запрашивает и получает журнал через пакеты udp. Этот поток также складывает данные в qlist.

2-У меня есть Qtimer, который по таймауту снимает с карты эти события, подготавливает массивы диаграммы и затем вызывает update

3-У меня есть переопределение метода paintEvent для этого виджета.

У меня есть мьютексы для синхронизации и защиты данных. Это плохой способ сделать это? Будем признательны за некоторые предложения относительно "БЕЗОПАСНОГО" способа ведения дел.

На заметке о том, что paintEvent - это не пользовательский виджет, который находится внутри моего главного окна. У меня есть второй поток (функция concurent), который периодически обновляет некоторые данные, а затем посылает сигнал для обновления полей меток, которые находятся за пределами пользовательского виджета, но внутри главного окна. может ли это иметь плохой побочный эффект на все?

1 Ответ

2 голосов
/ 23 февраля 2010

В целом, я думаю, у вас есть основание для надежной программы. Единственное предложение, которое я могу сделать, - это перенести задачу №2 в свою ветку. Вы можете использовать тот факт, что вы можете рисовать на QImage вне основного потока пользовательского интерфейса, чтобы подготовить массивы диаграмм в другом потоке. Это устранило бы наибольшее потенциальное узкое место в отзывчивости пользовательского интерфейса из вашего кода и не добавило бы намного большей сложности, так как в вашей программе уже есть потоки. Обновление на QTimer может работать там также. Когда новое изображение будет готово, вы можете отправить его либо через сигнал, либо через опубликованное событие на свой пользовательский интерфейс, который затем сможет скопировать изображение и обновить его отображение.

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