【发布时间】:2014-11-25 19:58:38
【问题描述】:
在我的一个 Qt 应用程序中更新 QWidget 时,我发现了一种非常奇怪的情况。发生的情况是,当 widget->update() 方法在没有任何警告或命令的情况下被调用时,widget 的 paintEvent(QEvent*) 突然停止被调用。
我的应用程序在带有 Qt 4.8.5 for ARM 的嵌入式 Linux 中工作,有两个(相关)线程:一个从套接字连接获取数据,用它填充缓冲区并调用远程对象中的一个插槽,要求它更新绘图小部件(使用 update() 函数)。另一个线程是负责执行void paintEvent(QEvent*) 函数的小部件绘制(Qt 中的规则)的主线程。所以事件的顺序是:
- 读取线程获取并识别数据包
- 读取线程将数据放入缓冲区(QAbstractTableModel 派生类)
- 在同一个函数中,读取线程使用 Qt::DirectConnection 向 UI 基本小部件发出信号,该 UI 基本小部件将绘图小部件作为其子小部件。接收器插槽称为
slotPQDataChanged。 -
slotPQDataChanged调用子部件的update函数:poSubWidget->update(); - 在主线程中,在Qt“希望”的那一刻,poSubWidget 的
paintEvent(QEvent*)函数被调用。它内部有一个 QPainter,可以在其上绘制接收到的数据。
这个过程每秒发生 5 次。当我启动系统时,一切都运行良好一段时间(通常 5-10 分钟),但突然 poSubWidget 的更新停止发生。我确定不是阅读线程停止了,因为由于调用了qDebug(),我知道继续调用“slotPQDataChanged”。我也知道这不是被杀死的主线程或类似的东西,因为当问题发生时屏幕上的计时器继续正常工作。而且我知道在调用update() 时我要求子小部件不要更新的代码中没有任何意义。
当然,我不知道发生了什么。对 SO 的(快速)研究没有得到积极的结果。
值得一提的是,我的应用程序可能有一个错误,有时会因为“内存不足”而被杀死。
那么,对可能发生的事情有什么建议吗?
【问题讨论】:
标签: c++ multithreading qt