2013-03-26 63 views
0

我正在开发一个应用程序使用Qt主逻辑和Wt用户界面。为什么我编辑的WtWithQt示例崩溃?

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

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

应用程序在该点崩溃。 我不明白为什么。

编辑:其实它真的崩溃时它编辑重量物体在"HelloApplication::doGreet(const QString& qname)"

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

感谢提前任何帮助!

+0

这将有助于知道你遇到了什么样的崩溃,可能还有回溯。 – 2013-03-27 08:49:36

+0

没错。在这里你去:https://dl.dropbox.com/u/90945130/crash.png,我希望这可以帮助。 – TrueFurby 2013-03-27 09:14:26

回答

1

你在这里展示的是一个QThread,它更新了Wt构件树,并没有获取WApplication :: UpdateLock。除了确保您拥有对小部件树的独占访问权外,更新锁还会设置一些线程本地存储,而缺少的TLS(WApplication :: instance())会导致应用程序崩溃。

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

+0

感谢您的解释。我发现这个解决方案http://redmine.webtoolkit.eu/boards/1/topics/5182,我可以立即使用它。 – TrueFurby 2013-03-27 12:27:34