在另一个线程的槽中未接收到从一个线程发送带有 size_t 变量的信号

Posted

技术标签:

【中文标题】在另一个线程的槽中未接收到从一个线程发送带有 size_t 变量的信号【英文标题】:sending signal with a size_t variable from a thread is not received in the other thread's slot 【发布时间】:2019-11-08 16:07:20 【问题描述】:

我有这两个信号:

void dataSampled(size_t a);
void error(const QString& message);

其他地方:

    m_acquisitionThread = new QThread(this);
    m_acquisitionManager = new AcquisitionManager();
    QObject::connect(m_acquisitionManager, &AcquisitionManager::dataSampled,
                     this,                 &Application::onDataSampled); // this Application pointer
    QObject::connect(m_acquisitionManager, &AcquisitionManager::error,
                     this,                 &Application::showError); // this Application pointer
    m_acquisitionManager->moveToThread(m_acquisitionThread);
    m_acquisitionThread->start();

AcquisitionManager 是一个移动到线程的对象,应用程序位于“主”线程中。

当我向应用程序发送信号时,连接到 dataSampled 的需要 size_t 的插槽不会执行,将 size_t 更改为 int(仅信号,插槽可以保持 size_t)甚至删除它可以解决问题。这真的很奇怪,有人知道为什么没有发送信号吗?在另一个应用程序(但单线程)中,我测试了 size_t 从信号发送到插槽没有问题(但上下文再次不同)。

void AcquisitionManager::executeDataAcquisition()

    emit dataSampled(666); // onDataSampled is never executed (only if I change signal type from size_t to an int or something else)
    emit error("foobar"); // Application::showError is always executed !

【问题讨论】:

你试过用 Qt::QueuedConnection 连接吗?这应该会处理好它,而不必将其注册为元类型。 【参考方案1】:

注册 size_t 解决了这个问题:

 qRegisterMetaType<size_t>("size_t");

但是,size_t 不是像 int 这样的原始类型吗?

【讨论】:

可能见bugreports.qt.io/browse/QTBUG-42106。 std::size_t&lt;cstddef&gt; 和其他头文件中定义为某些真实原始类型的别名。它不是完全原始的,尽管它内置sizeof 运算符的结果...这就是C++ 中的生活,其中stdlib 的某些部分对于使用核心功能是必不可少的。 @underscore_d 感谢您的澄清!

以上是关于在另一个线程的槽中未接收到从一个线程发送带有 size_t 变量的信号的主要内容,如果未能解决你的问题,请参考以下文章

为啥套接字被阻止接收,而我睡在另一个线程上?

QT多线程操作

在 Android 中同时使用 Datagramsocket 发送和接收 - 只是发送?

在另一个线程上接收的套接字上触发 EAGAIN

Serialport DataRecieved 线程在执行前结束

使用互斥锁锁定向量 - Boost