重绘Widget时Qt崩溃

时间:2014-09-09 09:31:59

标签: c++ multithreading qt

我有一个定制的播放器,可以“播放”重新编码的媒体样本(带有时间戳的传感器数据)。

我想要做的是将这个玩家与Qt UI结合起来。我已经创建了一个Widget,并通过信号和插槽(Qt :: DirectConnection)将Player和Widget耦合在一起。

我遇到的问题是程序因抛出异常而崩溃。它崩溃的那一刻是完全随机的,有时它可能不会崩溃。据我所知,问题在于小部件中的更新不是线程安全的。我已经尝试使用二进制信号量限制对它的访问(如果信号量为真,则立即返回,否则返回)。错误仍然没有消失。

我的问题是:Qt Painter是否在与Widget更新程序相同的线程上运行?我怀疑在上一次油漆操作完成之前我正在给画家打电话,这就是它仍然崩溃的原因。我怀疑小部件只是以某种方式向画家发布了一个事件(非阻塞)..

还有什么问题?不幸的是,代码太复杂,无法在此处粘贴。但是,我附上了崩溃的截图。

干杯, 米哈伊

enter image description here

1 个答案:

答案 0 :(得分:0)

感谢您的宝贵意见。我设法找到了问题的根本原因。它与Qt::DirectConnection绑定。如API文档中所述,这将执行:

  

"在发射器的线程中,它不一定是接收器的   。螺纹"

在我的例子中,发射器是播放器,接收器是UI线程。这意味着我在UI线程之外操作UI中的元素。这是根本原因。

我已将实现更改为使用Qt::QueuedConnection,现在它可以顺利运行。

至于为什么Qt::QueuedConnection的原始实现最初不起作用,我将bool status = connect()总是返回false,这意味着连接失败。我将信号方法的名称更改为与插槽1的名称不同(最初,它们是相同的),+我将所有输入参数默认为标准类型(unsigned int而不是tUInt32 )它工作。 connect()现在返回true。我怀疑connect()在某种程度上对布线感到困惑..