2012-02-18 32 views
2

Qtを使ってプロジェクトを実行していますが、invokeメソッドは別のスレッドで実行され、メインスレッドから呼び出されます。 QByteArrayをconstとして渡してビルドして実行します。 しかし、constをビルドするとビルドされますが、実行しようとすると終了します。 とアサートをスローしますQ_ASSERT(b)QMetaObject :: invokeMethodはconst以外の引数をとらない

なぜ終了するのですか?

QByteArrayにデータを追加する必要があります。

const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum", 
           Qt::AutoConnection, 
           Q_ARG(QByteArray, buffer), 
           Q_ARG(int, format.frequency()), 
           Q_ARG(int, bytesPerSample), 
           Q_ARG(qint64, dataLength)); 
    Q_ASSERT(b); 
    Q_UNUSED(b) // suppress warnings in release builds 
+0

'calculateSpectrum'の署名は何ですか?あなたは 'バッファ'が呼び出し側で変更されることを期待していますか? – Mat

+0

はい私はバッファとシグネチャがスペクトルアナライザ(qbytearrayバッファ、int頻度、intバイト、qint64データ長)を変更することを期待しています – ken

+0

あなたの質問に正しい方法の署名を編集してください(タグの下の "編集"リンクを使用してください)。 – Mat

答えて

4

は基本的にQMetaobject ::は、invokeMethodの署名が今

bool invokeMethod (QObject * obj, const char * member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument(0), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument()); 

この中で、我々は構文ですQ_ARGマクロを使用している

が..

QGenericArgument Q_ARG (Type, const Type & value) 

必要とする...ですconstパラメータ。

このconstパラメータを削除すると、条件がfalseになり、実行時にアサートがスローされます。

関連する問題