スレッド間通信にsignal/slotを使って実装しようと考えています。
その際に通信するデータが自前クラスの予定なのですが
Qtのsignal/slotとthread(2)
上記のサイトを信じる限り、自前クラスをそのままやり取りするのはあまりオススメしないみたいです
やるとしても参照渡し?
サイトを見る限りQSharedPointerを使用したやり方が一番安全?なのかな
という感じですが
そもそも、自前クラスのやり取りはやめとけ!!
というものなのか、それとももっと良いやり方があるのかが分かりませんでした
状況によっては別の実装方法を考える必要もあります...
何かオススメのやり方を知っている方
クラスのやり取りはやめとけ!という考えの方
是非とも回答のほどよろしくお願いいたします。
######追記
質問の回答を待ちながら並行して実装を進めていたのですが
自前クラスをsignal/slotでやり取りするのが上手く行きませんでした...
Q_DECLARE_METATYPE
とqRegisterMetatype<>()
の使い方がいまいち分かりません...
ご教授お願いいたします
c++
1//event.h 2 3class EventData 4{ 5public: 6 EventData() 7 { 8 code = 0; 9 string = ""; 10 } 11 12public: 13 int code; 14 QString string; 15};
これが実際にやり取りに使いたい自前クラスだとします。これを
c++
1// test.h 2#include <event.h> 3#include <QObject> 4 5class test: public QObject 6{ 7 Q_OBJECT 8 Q_DECLARE_METATYPE(EventData) 9 10signals: 11 void sDataTransmission(const EventData data); 12 13private slots: 14 void receiveData(const EventData data); 15 16public: 17 MainProcessor(); 18};
c++
1// test.cpp 2#include <test.h> 3 4test::test() 5{ 6 qRegisterMetatype<EventData>(); 7 8 connect(this, SIGNAL(sDataTransmission(const EventData)), aite, SLOT(receiveData(const EventData))) 9 connect(aite, SIGNAL(sDataTransmission(const EventData)), this, SLOT(receiveData(const EventData))) 10} 11 12void test::receiveData(const EventData data) 13{ 14 qDebug() << "test: " << QThread::currentThread(); 15}
とこのように記述してみたのですが、Q_DECLARE_METATYPE(EventData)
の部分でエラーが出てしまいました。
実際にエラーが出ているのはマクロ内部で、出ているエラーは
explicit specialization in non-namespace scope 'class test'
specialization of 'template<class T> struct QMetaTypeId' must appear at namespace scope
'struct QMetaTypeId<EventData>' redeclared with different access
等と数種類出ている状態です...
どのようにして使用すれば良いのでしょうか

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/19 08:03