многопоточность — C ++ Qt быстрая синхронизация совета асинхронных процессов

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

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

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

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

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

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

0

Решение

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

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

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

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

0

Другие решения

Я бы попробовал это с тремя потоками: 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кольцевой буфер с тремя буферами является наименьшим.

0