【问题标题】:Why does my edited WtWithQt example crash?为什么我编辑的 WtWithQt 示例会崩溃?
【发布时间】:2013-03-26 19:33:28
【问题描述】:

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

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

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

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

EDIT:实际上当它在"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

提前感谢您的帮助!

【问题讨论】:

标签: c++ qt wt


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2012-04-20
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
相关资源
最近更新 更多