元のコードはここに投稿するのに大きなものです。基本的に、私はこれをやっている:Qtスロットの引数が壊れています
class MySuperClass
{
QThread thread;
MyClass myObject;
MySuperClass()
{
connect(this, &MySuperClass::onKill, &myObject, &MyClass::stop);
connect(&thread, &QThread::started, &myObject, &MyClass::loop);
connect(&myObject, &MyClass::finished, &thread, &QThread::quit);
myObject.moveToThread(&thread);
qRegisterMetaType<uint16_t>("uint32_t");
connect(this, &MySuperClass::changed, &myObject, &MyClass::onChange);
}
void do()
{
emit changed(0);
}
}
'onKill-stop'シグナル/スロットはパラメータを持たず正常に動作する。ここでは問題ありません。
問題は 'changed - onChange'です。それらにはuint32_t型の1つのパラメータ(登録済み)があります。
MySuperClassのメソッドdo
をメインスレッドから呼び出すと、信号が発信され、スロットonChangeが呼び出されますが、パラメータは0ではありません! これは、3043426304のような大きな数字です。
面白いのは、接続タイプをDirectConnectionに変更した場合、パラメータはゼロです。接続タイプをQueuedConnectionに変更すると、パラメータもゼロになります。どうすればいいの? AutoConnectionがQueuedかDirectですか?
私はこれに非常に困惑しています。まず第一に、スタックに割り当てられた整数型パラメータがどうしてそんなに壊れているのでしょうか?ヒープ割り当てされたものか、複数のスレッドで使用されたものなのか分かります。
私の2番目の質問は次のとおりです。この接続を正しく行うにはどうすればよいですか? connectとmoveToThreadの順序は関係しますか?
奇妙なことがあります:qRegisterMetaType( "uint32_t");それはqRegisterMetaTypeであるべきではありません。( "uint32_t"); –
CppChris
ChrisGがあなたの問題を指摘している可能性があります(ここでは+1)。しかし、quint32(uint32_tと互換性があります)を使用することはできますが、あらかじめ登録しておけば、登録する必要がなくなり、間違いを見つけにくくなる可能性があります。 –
@ChrisG riiight、それは私の愚かなことです!愚かなコピーペーストエラー。私は、3043426304が2つの最下位ビットに0を持つことに気付かなかった。ありがとうございました!私はそれを受け入れることができるようにあなたのコメントを答えにすることができますか? (私はまだmoveToThreadの注文と接続の呼び出しに興味がありますが)。 – Amomum