我有一个定制的播放器,可以“播放”重新编码的媒体样本(带有时间戳的传感器数据)。
我想要做的是将这个玩家与Qt UI结合起来。我已经创建了一个Widget,并通过信号和插槽(Qt :: DirectConnection)将Player和Widget耦合在一起。
我遇到的问题是程序因抛出异常而崩溃。它崩溃的那一刻是完全随机的,有时它可能不会崩溃。据我所知,问题在于小部件中的更新不是线程安全的。我已经尝试使用二进制信号量限制对它的访问(如果信号量为真,则立即返回,否则返回)。错误仍然没有消失。
我的问题是:Qt Painter是否在与Widget更新程序相同的线程上运行?我怀疑在上一次油漆操作完成之前我正在给画家打电话,这就是它仍然崩溃的原因。我怀疑小部件只是以某种方式向画家发布了一个事件(非阻塞)..
还有什么问题?不幸的是,代码太复杂,无法在此处粘贴。但是,我附上了崩溃的截图。
干杯, 米哈伊
答案 0 :(得分:0)
感谢您的宝贵意见。我设法找到了问题的根本原因。它与Qt::DirectConnection
绑定。如API文档中所述,这将执行:
"在发射器的线程中,它不一定是接收器的 。螺纹"
在我的例子中,发射器是播放器,接收器是UI线程。这意味着我在UI线程之外操作UI中的元素。这是根本原因。
我已将实现更改为使用Qt::QueuedConnection
,现在它可以顺利运行。
至于为什么Qt::QueuedConnection
的原始实现最初不起作用,我将bool status = connect()
总是返回false
,这意味着连接失败。我将信号方法的名称更改为与插槽1的名称不同(最初,它们是相同的),+我将所有输入参数默认为标准类型(unsigned int
而不是tUInt32
)它工作。 connect()
现在返回true
。我怀疑connect()
在某种程度上对布线感到困惑..