Совет C++ Qt по быстрой синхронизации асинхронных процессов

В настоящее время я имею дело с графическим интерфейсом Qt, который мне нужно настроить для измерительного устройства. Устройство работает с картой захвата кадров, которая очень быстро захватывает изображения с линейной камеры. Обработка моего изображения, которая не является такой сложной, занимает 0,2 мс, а для отображения сигнала и результата обработки с помощью QCustomPlot требуется около 40 мс, что совершенно нормально. Помимо вывода GUI, обработанный сигнал также будет выводиться в виде аналогового сигнала устройством сбора данных NI.

Моя проблема в том, что я должен обновлять аналоговый сигнал с постоянной частотой и время от времени обновлять графический интерфейс.

Мой текущий подход или идея состояла в том, чтобы создать поток пула данных и два рабочих потока. Один рабочий поток получает данные от фреймграббера, обрабатывает их и обновляет пул данных. Второй рабочий поток обновляет аналоговый канал NI DAQ с определенной частотой около 2-5 кГц, заданной часами в NI DAQ устройстве. И поток GUI будет время от времени считывать пул данных, чтобы обновлять отображение сигнала с частотой около 20-30 Гц.

Я хотел использовать управление потоками Qt и механизм сигналов и слотов из-за его «простоты» и потому, что я уже работал с потоками в сочетании с Qt и его классами потоков.

Может быть, есть лучший способ, есть ли у кого-нибудь идея или какое-либо предложение? Возможно ли, что у меня проблемы с синхронизацией потоков?

Кроме того, возможно ли назначить один поток одному ядру ЦП на многоядерном ЦП, чтобы это ядро ​​​​обрабатывало только этот единственный поток?


person David P    schedule 07.06.2015    source источник


Ответы (2)


Может быть, есть лучший способ, есть ли у кого-нибудь идея или какое-либо предложение? Возможно ли, что у меня проблемы с синхронизацией потоков?

Механизм Signal/Slot в порядке, попробуйте его, и если у вас возникнут проблемы с производительностью, вы все равно можете попытаться найти другой подход. Я использовал Signal/Slot Mechanism для обработки видео в реальном времени с помощью QAbstractVideoSurface и Mediaplayer. Это сработало для меня.

Кроме того, возможно ли назначить один поток одному ядру ЦП на многоядерном ЦП, чтобы это ядро ​​​​обрабатывало только этот единственный поток?

Почему ты бы так поступил? В операционной системе или библиотеке потоков есть планировщик, который заботится о таких вещах. Пока у вас нет веских причин делать это самостоятельно, вы должны просто использовать существующий способ.

person ixeption    schedule 07.06.2015

Я бы попробовал это с тремя потоками: 1) поток пользовательского интерфейса, 2) поток захвата и обработки, 3) поток аналогового вывода.

Хитрость заключается в использовании тройного буфера для подключения вывода захвата и обработки к входу аналогового вывода.

Скажем, в момент t поток(2) заканчивает обработку frame[(t+0)%3], немедленно меняет назначение вывода на frame[(t+1)%3] и уведомляет поток(3), который перебирает данные в frame[(t+2)%3], чтобы при необходимости переключиться на frame[(t+0)%3].

Я использовал эту технику, когда работал над проектом обработки изображений с частотой кадров обработки 10 кадров в секунду и частотой кадров вывода NTSC 60 кадров в секунду. Чтобы устранить tearing effect, кольцевой буфер с тремя буферами является наименьшим.

person user3528438    schedule 07.06.2015