真的卡住了,需要一些建议或真实的例子。

1)我有boost::thread vector 生产者线程(数据快速到达〜每秒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。从UI-EventLoop上的QTimer调用OnTimeout。为了防止争用,它只是将当前缓冲区指针与第二个缓冲区进行互锁交换。因此,不需要繁重的同步(例如Mutext / Semaphore)。

仅当渲染renderBatch的工作量少于超时时,这才起作用。

07-26 04:20