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

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

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

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

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


图片: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

感谢您的任何帮助!

最佳答案

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

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

09-05 20:37
查看更多