【发布时间】:2014-03-01 09:32:29
【问题描述】:
以下内容描述了该问题以及我为“纠正”它们所做的工作。此运行时事件需要几个小时才能解决。由于该网站是我最喜欢的信息来源之一,因此认为这可能会使某人受益。
我确定这个异常是我对 QObjectCleanupHandler 的误解造成的。任何关于 QObjectCleanupHandler 实际实现的建设性 cmet 将不胜感激。
-- 将带有 QPointer 的 QObjectCleanupHandler 添加到 MDI 子窗口和工作类。
- 运行调试应用程序。
在运行结束时:
弹出一个对话框,其中包含似乎是程序集堆栈数据的内容。
在 QT Creator 菜单中查看调试日志:Windows\Views\Debugger Log\
日志片段:
移到底部
::::
片段:
移到底部
dState 从 InferiorRunRequested(10) 更改为 InferiorRunOk(11) [大师] (1d84.1720):访问冲突 - 代码 c0000005(第一次机会) s sException at 0x67343a9c,代码:0xc0000005:读取访问冲突 at: 0x0, flags=0x0 (第一次机会) at c:\work\build\qt5_workdir\w\s\qtbase\src\corelib\kernel\qobject.cpp:2813 在任何异常处理之前报告第一次机会异常。 可以预期并处理此异常。 eax=03f160f1 ebx=00000000 ecx=03f3b728 edx=feeefeee esi=00000005 edi=00000000 eip=67343a9c esp=0046d1b8 ebp=0046d340 iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b
efl=00010202 Qt5Cored!QObject::disconnect+0x2bc: 2813 67343a9c 8b02 mov eax,dword ptr [edx] ds:002b:feeefeee=???????? s 异常在 0x67343a9c,代码:0xc0000005:读取访问冲突:0x0,标志=0x0 (第一次机会) dNOTE:下自发停止停止。状态 从 InferiorRunOk(11) 更改为 InferiorStopOk(14) [master] 解析符号:Qt5Cored!QObject::disconnect...
负责异常的源代码片段:
QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
trackObject(worker);
worker->movetothread(thread);
trackObject() 方法是 QMdiSubWindow 上的私有字段
class <form>
{
private:
QObjectCleanupHandler trackObject(QObject obj);
::: etc.
纠正措施:
源代码片段更改为:
QThread *thread = new QThread;
QPointer<vcSharedDataQt> worker = new vcSharedDataQt();
worker->movetothread(thread);
/* 删除了所有类中的所有 QObjectCleanupHandler 实例。 */
异常中定义的 QT 环境:QT KernelBase!RaiseException at 0x759fc41f
【问题讨论】:
-
如果您的应用程序没有更多上下文并分析正在发生的事情,那么它的用处有限。对我来说,崩溃的实际原因可能是
worker是从两个没有保护的线程访问的,从它操作的新线程和带有清理处理程序的(主)线程。现在看起来你正在泄漏线程和工作线程,所以我不确定问题是否得到妥善解决。 -
我认为您的评估是正确的。我将进一步研究线程资源的锁定,因为指针被插入到所有活动线程的 QList
> 中,并且只有在将 finalize 发送回主线程之后,QThread 对象才会从 QList 中删除。也许我需要在线程被添加到指针列表时实现一个锁。我会看看它。感谢您的评论。
标签: c++ qt exception memory-management qt-creator