qthread 쓰레드 통신문제
Unsolved
Korean
-
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
간 안전하게 전달할 수 있습니다.