QQuickPaintedItem paint()报错Timers cannot be stopp from another thread,这似乎导致子线程死循环?
QQuickPaintedItem paint() report error that Timers cannot be stopped from another thread, which seem to cause child threads endless loop?
我的代码如下:
void DrpltGyslPanel::paint(QPainter *painter)
{
view_->render(painter, boundingRect(), view_->viewport()->rect(), Qt::KeepAspectRatio);
}
DrpltGyslPanel
是 QQuickPaintedItem
的子类,view_
是 QGraphicsView
的实例。我知道 DrpltGyslPanel::paint
在 QSGRenderThread
中被调用,但是这个 Timer
有什么用呢?
而这也造成了子线程的死循环。
我怎样才能准确地杀死计时器?还是进一步了解究竟是什么导致了子线程死循环?
--------------------------------添加于 2019/12/19
如果 QGraphicsView
显示,无限循环将不会出现在 Release 构建中,并且会出现在 Debug 构建中.
调用 render 可能会在内部停止另一个线程中的计时器。
您不能在另一个线程中的 QPainter 上绘画。
您可以要求 _view
将自己呈现为 QImage 并使用另一个信号将其发送回 DrpltGyslPanel
。
您还可以在 DrpltGyslPanel
中有一个 QImage 实例,与 _view
共享它并使用 QMutex 来阻止这些线程读取或写入 QImage.
QGraphicsView::addItem
会在here.QGraphicsView::render
will kill timer at here默认间隔(2000ms)启动一个定时器。当kill timer时会估计当前线程是否为线程定时器存活以确保定时器使用在相同thread.So 我们无法从 QSGRenderThread
调用 DrpltGyslPanel::paint
中的 QGraphicsView::render
。
代码更正如下:
void DrpltGyslPanel::update(const QRect &rect)
{
renderPixman = QPixmap(view_->viewport()->rect().size());//renderPixman is member variable
QPainter painter(&renderPixman);
view_->render(&painter, boundingRect(), view_->viewport()->rect(),
Qt::KeepAspectRatio);
QQuickPaintedItem::update(rect);
}
以及为什么会导致子线程死循环,也就是timerEvent
总是被触发。
我的代码如下:
void DrpltGyslPanel::paint(QPainter *painter)
{
view_->render(painter, boundingRect(), view_->viewport()->rect(), Qt::KeepAspectRatio);
}
DrpltGyslPanel
是 QQuickPaintedItem
的子类,view_
是 QGraphicsView
的实例。我知道 DrpltGyslPanel::paint
在 QSGRenderThread
中被调用,但是这个 Timer
有什么用呢?
而这也造成了子线程的死循环。
我怎样才能准确地杀死计时器?还是进一步了解究竟是什么导致了子线程死循环?
--------------------------------添加于 2019/12/19
如果 QGraphicsView
显示,无限循环将不会出现在 Release 构建中,并且会出现在 Debug 构建中.
调用 render 可能会在内部停止另一个线程中的计时器。
您不能在另一个线程中的 QPainter 上绘画。
您可以要求 _view
将自己呈现为 QImage 并使用另一个信号将其发送回 DrpltGyslPanel
。
您还可以在 DrpltGyslPanel
中有一个 QImage 实例,与 _view
共享它并使用 QMutex 来阻止这些线程读取或写入 QImage.
QGraphicsView::addItem
会在here.QGraphicsView::render
will kill timer at here默认间隔(2000ms)启动一个定时器。当kill timer时会估计当前线程是否为线程定时器存活以确保定时器使用在相同thread.So 我们无法从 QSGRenderThread
调用 DrpltGyslPanel::paint
中的 QGraphicsView::render
。
代码更正如下:
void DrpltGyslPanel::update(const QRect &rect)
{
renderPixman = QPixmap(view_->viewport()->rect().size());//renderPixman is member variable
QPainter painter(&renderPixman);
view_->render(&painter, boundingRect(), view_->viewport()->rect(),
Qt::KeepAspectRatio);
QQuickPaintedItem::update(rect);
}
以及为什么会导致子线程死循环,也就是timerEvent
总是被触发。