如何在QThreads之间发送数据?

时间:2015-06-28 07:53:50

标签: c++ qthread

我在一个线程中有一个事件,需要在另一个线程中调用处理函数。通常我使用函数connect(),但是在两个线程的情况下我有一个错误:

QObject::connect: Cannot queue arguments of type 'QVector<unsigned char>'
(Make sure 'QVector<unsigned char>' is registered using qRegisterMetaType().)

我尝试使用qRegisterMetaType(),但不清楚我应该如何以及在何处声明它。 我编写了代码示例,它只是从thead1调用thread0中的执行。我没有包括我使用qRegisterMetaType()的尝试,因为它们都失败=)

thread0.h:

#ifndef THREAD0_H
#define THREAD0_H

#include <QThread>
#include <QVector>

class thread0 : public QThread
{
    Q_OBJECT
public:
    thread0();
    ~thread0();

protected:
    void run() Q_DECL_OVERRIDE;

public slots:
    void printBuff(QVector<unsigned char> vec);
};

#endif // THREAD0_H

thread1.h:

#ifndef THREAD1_H
#define THREAD1_H

#include <QThread>
#include <QVector>

class thread1 : public QThread
{
    Q_OBJECT
public:
    thread1();
    ~thread1();

protected:
    void run() Q_DECL_OVERRIDE;

signals:
    void sendToPrint(QVector<unsigned char> vec);
};

#endif // THREAD1_H

main.cpp中:

#include <QCoreApplication>
#include "thread0.h"
#include "thread1.h"
#include <QObject>
#include <QMetaType>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    thread0 *th0 = new thread0();
    thread1 *th1 = new thread1();

    QObject::connect(th1, &thread1::sendToPrint, th0, &thread0::printBuff);

    th0->start();
    th1->start();

    return a.exec();
}

和thread1.cpp:

#include "thread1.h"

thread1::thread1()
{

}

thread1::~thread1()
{

}

void thread1::run()
{
    QVector<unsigned char> vec = {0, 1, 2, 3};
    emit sendToPrint(vec);
}

P.S。如果我使用直接连接代码工作。

QObject::connect(th1, &thread1::sendToPrint, th0, &thread0::printBuff, Qt::DirectConnection);

1 个答案:

答案 0 :(得分:1)

在你的main()

中添加它
qRegisterMetaType<QVector<unsigned char> >("QVector<unsigned char>");

在线程之间,Qt使用排队连接。该机制要求通过信号将每个类型作为参数传递给Qt元对象系统的槽。大多数Qt类型已经注册,但不是模板类型,因为每个模板专业化需要一个qRegisterMetaType

如果使用直接连接,您的代码似乎可以正常工作,但printBuff将在th1中运行,而不是在th0中运行。事实上,th0线程什么也不做。如果printBuff被设计为仅在thread0中运行,由于线程安全问题,这可能会导致程序崩溃。