为什么我编辑的WtWithQt示例崩溃了?

时间:2013-03-26 19:33:29

标签: c++ qt wt

我正在使用Qt为主逻辑和Wt为用户界面开发应用程序。

但是我遇到了一个我无法解决的问题。我已将它应用于wtwithqt示例。

我只更改了“passGreet”函数来异步调用信号而不是直接调用。

应用程序崩溃。我真的不明白为什么。

编辑:实际上它在"HelloApplication::doGreet(const QString& qname)"编辑Wt对象时真的崩溃了

enter image description here 图片:https://dl.dropbox.com/u/90945130/crash.png

从Qt事件循环开始,动作的起源可能是什么?

这是代码。

#include "HelloApplication.h"
#include "QtObject.h"

#include <QDebug>
#include <QThread>

QtObject::QtObject(HelloApplication *wt, QObject *parent)
  : QObject(parent),
    wt_(wt)
{}

void QtObject::passGreet(const QString& name)
{
    //Q_EMIT greet(name);
    QMetaObject::invokeMethod(this, "greet", Qt::QueuedConnection, Q_ARG(QString, name));
}

void QtObject::doGreet(const QString& name)
{
    wt_->doGreet(name);
}

其余未更改的代码位于:http://pastebin.com/fih6P2eH

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你在这里展示的是一个更新Wt小部件树的QThread,它没有抓住WApplication :: UpdateLock。除了确保您对窗口小部件树具有独占访问权限之外,更新锁还会设置一些线程本地存储,并且丢失的TLS(WApplication :: instance())会导致应用程序崩溃。

所需的锁定机制可能很复杂 - 使用WServer :: post()可以更容易地避免死锁。