【发布时间】:2016-04-19 10:48:15
【问题描述】:
原来的代码太大了,贴在这里。基本上,我正在这样做:
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' 信号/槽没有参数并且工作正常。这里没问题。
问题是“已更改 - onChange”对。他们有一个 uint32_t 类型的参数(我已经注册过)。
当我从主线程调用 MySuperClass 的方法 do 时,信号被发出,插槽 onChange 被调用,但它的参数不是 0!
这是一个像 3043426304 这样的大数字。
有趣的是:如果我将连接类型更改为 DirectConnection - 参数为零;如果我将连接类型更改为 QueuedConnection - 参数也为零!怎么会这样? AutoConnection 不是 Queued 还是 Direct?
我对此感到非常困惑。首先:堆栈分配的整数类型参数如何被破坏?我会理解它是堆分配的还是在多个线程中使用的。
我的第二个问题是:我应该如何正确地进行这种连接? connect 和 moveToThread 的顺序重要吗?
【问题讨论】:
-
有些奇怪:qRegisterMetaType
("uint32_t");那不应该是 qRegisterMetaType ("uint32_t"); -
ChrisG 可能已经指出了您的问题(此处为 +1)。但是,您可以使用 quint32(它可以与 uint32_t 互换),但它是预先注册的,因此您可以避免必须注册它并且难以发现错误:)
-
@ChrisG riiight,我太傻了!愚蠢的复制粘贴错误。我没有注意到 3043426304 在两个最低有效位中有零。谢谢!您能否将您的评论作为答案,以便我接受? (尽管我仍然对 moveToThread 和 connect 调用的排序感兴趣)。
-
@code_fodder 我真的不明白为什么每个人都必须为固定长度类型创建自己的 typedef。 Qt 中有 quint32,Glib 中有 guint32,uC/OS 中有 SINT32 - 如果有 standart 类型定义,为什么还要麻烦?
-
@Amomum 好吧,它只是一个 Qt 的东西,这样你就可以得到一个“免费注册”的类型。但我完全同意你的看法,我总是在任何地方使用 uint16_t 。但是在 Qt 中,使用其内置类型时,您会少一些麻烦。
标签: c++ multithreading qt qthread