Подумал и обобщил вопрос.
Есть два треда ThreadA и ThreadB. У первого есть указатель на второй.
Надо передавать данные из А в В без сигналов слотов между ThreadA и ThreadB так чтобы это было ThreadSafe и не тормозило треды.
И да, код слота slotSendData есть ThreadSafe и он обрабатывает данные и может отправить их в другой тред.
Прилагаю файлы с примером как я это сделал.
Есть множество тредов (или объектов в разных тредах) между которыми надо передавать данные в QByteArray.
Я сделал так что каждый объект сбрасывает данные в главный тред и там определяется куда его отправить дальше (в другой тред).
Думаю нельзя соединить много объектов сигналами во всех комбинациях поэтому так делаю.Алгоритм кратко:
1) ThreadA по указателю вызывает функцию functionSendData из ThreadB
2) в функции functionSendData вызывается сигнал signalSendData который соединен со слотом в этом же ThreadB
3) обрабатывается слот slotSendData изпод ThreadB
Выходит ThreadA по сигналу запускает слот в ThreadB и при этом нет явного соединения ThreadA<=>ThreadB и любой тред может обратится к другому без предварительного connect к нему.
Скажите оптимально ли это реализовано?
main.cpp
#include <QtGui/QApplication>
#include "threada.h"
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug()<<"START ============================";
qDebug()<<"Main Thread ID: "<<a.thread()->currentThreadId();
ThreadB threadB;
ThreadA threadA(&threadB);
return a.exec();
}
threada.h
#ifndef THREADA_H
#define THREADA_H
#include <QThread>
#include "threadb.h"
class ThreadA : public QThread
{
Q_OBJECT
public:
ThreadA(ThreadB*);
void run();
private:
ThreadB *threadB;
};
#endif // THREADA_H
threada.cpp
#include "threada.h"
#include <QDebug>
ThreadA::ThreadA(ThreadB *thB)
: QThread()
{
threadB=thB;
moveToThread(this);
start();
}
void ThreadA::run()
{
QByteArray dataToSend="HELLO WORLD!";
qDebug()<<"functionSendData("+dataToSend+") From "<<currentThreadId();
threadB->functionSendData(dataToSend);
//exec();
}
threadb.h
#ifndef THREADB_H
#define THREADB_H
#include <QThread>
class ThreadB : public QThread
{
Q_OBJECT
public:
ThreadB();
void functionSendData(QByteArray);
private slots:
void slotSendData(QByteArray);
signals:
void signalSendData(QByteArray);
};
#endif // THREADB_H
threadb.cpp
#include "threadb.h"
#include <QDebug>
#include <QCoreApplication>
ThreadB::ThreadB()
: QThread()
{
connect(this,SIGNAL(signalSendData(QByteArray)),this,SLOT(slotSendData(QByteArray)));
moveToThread(this);
start();
}
void ThreadB::slotSendData(QByteArray data)
{
//чтото делать с данными
qDebug()<<"slotSendData("+data+") From "<<currentThreadId();
qDebug()<<"END ============================";
QCoreApplication::quit();
}
void ThreadB::functionSendData(QByteArray data)
{
qDebug()<<"signalSendData("+data+") From "<<currentThreadId();
emit signalSendData(data);
}
Вывод Debug
Main Thread ID: 0x1af4
functionSendData(HELLO WORLD!) From 0x1f6c
signalSendData(HELLO WORLD!) From 0x1f6c
slotSendData(HELLO WORLD!) From 0x1e34