Застрял, нужно несколько советов или реальных примеров.
1) У меня есть Boost :: Thread Вектор-производитель потока (данные приходят быстро ~ 100 выборок в секунду)
2) Я хочу, чтобы QMathGL рисовал данные по мере их поступления
3) Я не хочу, чтобы мой Qt GUI зависал
Я пытался переместить QMathGL :: update () в отдельный поток — Qt утверждает, что QPixmap не разрешен в отдельном потоке.
Что я должен попробовать, без изменения QMathGL?
Единственное, что приходит на ум — перекрасить по таймеру (fps?), Но мне не нравится это решение, пожалуйста, скажите мне, если я ошибаюсь.
Я также иногда сталкиваюсь с подобной проблемой.
Обычное разрешение, которое я использовал, — это буферизация данных и перерисовка по таймеру. Это идет по линии этого (псевдокод):
void Widget::OnNewData(void *dataSample)
{
this->threadSafebuffer->appendData(dataSample);
}
void Widget::OnTimeout()
{
DataBuffer renderBatch = this->threadSafebuffer->interlockedExchange();
/* Do UI updates according to renderBatch */
}
Это предполагает, что OnNewData вызывается в фоновом потоке. OnTimeout вызывается из QTimer в пользовательском интерфейсе EventLoop. Чтобы предотвратить конфликт, он выполняет взаимоблокированный обмен указателем текущего буфера со вторым буфером. Поэтому не требуется тяжелая синхронизация (например, мьютекст / семафор).
Это будет работать только в том случае, если объем работы по визуализации renderBatch меньше времени ожидания.
Я настоятельно рекомендую пойти с таймером. Операции перекраски являются дорогостоящими, и я предполагаю, что ни один пользователь не сможет реально обработать более 10 печатных векторов в секунду. Так что я не вижу реальной выгоды для конечного пользователя, кроме, возможно, того, что дисплей обновляется более «плавно» и вводится для входа. Но вы могли бы добиться этих эффектов гораздо проще с анимацией;)
При перекраске с каждым изменением данных вы получаете раздражающее поведение, которое вы описываете. Обойти это (imho) не стоит хлопот.