0

メインロジックにQt、ユーザーインターフェイスにWtを使用してアプリケーションを開発しています。

しかし、私は解決できない問題に直面しました。wtwithqtの例に適用しました。

「passGreet」関数を変更して、シグナルを直接ではなく非同期で呼び出すようにしました。

その時点でアプリケーションがクラッシュします。理由がよくわかりません。

編集:実際には、Wtオブジェクトを編集すると実際にクラッシュします"HelloApplication::doGreet(const QString& qname)"

ここに画像の説明を入力してください 写真: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

事前に助けてくれてありがとう!

4

1 に答える 1

1

ここに表示されているのは、Wtウィジェットツリーを更新するQThreadであり、WApplication::UpdateLockを取得しませんでした。ウィジェットツリーへの排他的アクセス権があることを確認するほかに、更新ロックによってスレッドローカルストレージも設定され、TLS(WApplication :: instance())が欠落しているとアプリケーションがクラッシュします。

必要なロックメカニズムは複雑になる可能性があります。デッドロックを回避するには、WServer :: post()を使用する方が簡単な場合があります。

于 2013-03-27T09:38:33.470 に答える