qt - QQuickPaintedItem paint() 报错Timers 无法从另一个线程停止,这似乎导致子线程死循环?
问题描述
我的代码如下:
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
使用另一个信号。您还可以在 中拥有一个QImage实例DrpltGyslPanel
,与它共享_view
并使用QMutex来阻止这些线程读取或写入QImage。
推荐阅读
- scala - Spark Scala 数据框列不匹配
- c# - SSIS 脚本任务找不到 Newtonsoft.Json
- c# - 使用 base64 在 iFrame 中渲染 PDF 的问题
- javascript - 选择表单材质 UI,不能覆盖占位符
- android - Expo App 未显示位置权限弹出窗口
- amazon-web-services - EKS 1.11 + Istio 1.0.6 + Cilium 1.4.1,发布 https://istio-sidecar-injector.istio-system.svc:443/inject?timeout=30s:地址不允许
- gis - Here Isoline Departure 字段可以追溯到多远?
- regex - 使用包含文本的正文的第一行填充电子邮件的主题行
- python - 在 Dropbox 上使用常见的 virtualenvs
- python - 如何从 csv 文件中检索特定的行和列