我在一个线程中有一个事件,需要在另一个线程中调用处理函数。通常我使用函数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);
答案 0 :(得分:1)
在你的main()
中添加它qRegisterMetaType<QVector<unsigned char> >("QVector<unsigned char>");
在线程之间,Qt使用排队连接。该机制要求通过信号将每个类型作为参数传递给Qt元对象系统的槽。大多数Qt类型已经注册,但不是模板类型,因为每个模板专业化需要一个qRegisterMetaType
如果使用直接连接,您的代码似乎可以正常工作,但printBuff将在th1中运行,而不是在th0中运行。事实上,th0线程什么也不做。如果printBuff被设计为仅在thread0中运行,由于线程安全问题,这可能会导致程序崩溃。