QVector를 QThread 간 통신에서 signal과 slot을 통해 전달할 수 있습니다. QVector<int> 같은 기본적인 타입의 QVector는 Qt의 QueuedConnection에서 자동으로 복사되어 전달됩니다.
1. QVector를 signal과 slot을 통해 전달하는 예제
아래 예제에서는 두 개의 QThread가 있고, 하나의 스레드에서 QVector<int> 데이터를 생성하여 다른 스레드로 전달하는 방식입니다.
// 데이터를 생성하는 스레드
class Producer : public QThread {
Q_OBJECT
signals:
void dataProduced(QVector<int> data);
protected:
void run() override {
QVector<int> data = {1, 2, 3, 4, 5};
emit dataProduced(data); // QVector 전달
msleep(1000);
}
};
// 데이터를 처리하는 스레드
class Consumer : public QThread {
Q_OBJECT
public slots:
void processData(QVector<int> data) {
qDebug() << "Received QVector<int>:" << data;
}
};
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
Producer producer;
Consumer consumer;
QObject::connect(&producer, &Producer::dataProduced, &consumer, &Consumer::processData, Qt::QueuedConnection);
consumer.start();
producer.start();
producer.wait();
consumer.quit();
consumer.wait();
return a.exec();
}
2. 요약
QVector<int> 같은 기본 타입을 담은 QVector는 Qt의 QueuedConnection에서 자동으로 복사 전달됩니다.
만약 QVector<MyClass>처럼 사용자 정의 클래스가 포함된 경우, Q_DECLARE_METATYPE(MyClass) 및 qRegisterMetaType<QVector<MyClass>>()을 호출해야 합니다.
대량의 데이터를 처리할 경우, 복사 비용을 줄이기 위해 const QVector<int>& 같은 참조를 사용하면 좋습니다.
이렇게 하면 QVector를 QThread 간 안전하게 전달할 수 있습니다.