class Requester : public QObject{ Q_OBJECT Requester () : QObject(0) { manager = new QNetworkAccessManager; QNetworkProxy proxy(QNetworkProxy::DefaultProxy, "127.0.0.1" , 5555); manager->setProxy(proxy); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); }public: void sendGET(int id, const QNetworkRequest &req) { ...... manager->get(req); ...... } void sendPOST(int id, const QNetworkRequest &req, const QByteArray &data) { ...... manager->post(req, data); ...... }private: QNetworkAccessManager *manager;prinvate slots: void replyFinished(QNetworkReply* reply);
QObject: Cannot create children for a parent that is in a different thread.(Parent is QNetworkAccessManager(0x13963008), parent's thread is QThread(0x13962fe8), current thread is QThread(0x13962fb8)
Requester *requester = new Requester(); QThread *thread = new QThread; requester->moveToThread(thread); QObject::connect(thread, SIGNAL(started()), requester, SLOT(startInThread())); QObject::connect(requester, SIGNAL(finished()), thread, SLOT(quit())); QObject::connect(requester, SIGNAL(finished()), requester, SLOT(deleteLater())); QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); thread->start();
class Requester : public QObject{Q_OBJECT...public slots: void sendGET(int id, const QNetworkRequest &req) {..} void sendPOST(int id, const QNetworkRequest &req, const QByteArray &data) {...}};
class ReplyThread : public QThread {...signals: void sendGET(int id, const QNetworkRequest &req); void sendPOST(int id, const QNetworkRequest &req, const QByteArray &data);}
Requester *requester = new Requester(); //выполняется допустим в главном потоке, или в отдельном потоке ReplyThread *thread = new ReplyThread ; //выполняется в отдельном потоке QObject::connect(thread, SIGNAL(sendGET(...)), requester, SLOT(sendGet(...))); QObject::connect(thread, SIGNAL(sendPost(...)), requester, SLOT(sendPost(...))); thread->start();
class Requester : public QObject{Q_OBJECT.....public slots: void startInThread() { ..... QObject::connect(this, SIGNAL(sendGET(...)), this, SLOT(slot_sendGet(...))); QObject::connect(this, SIGNAL(sendPost(...)), this, SLOT(slot_sendPost(...))); QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); ..... }...private slots: void slot_sendGET(int id, const QNetworkRequest &req) {..} void slot_sendPOST(int id, const QNetworkRequest &req, const QByteArray &data) {...}signals: void sendGET(int id, const QNetworkRequest &req); void sendPOST(int id, const QNetworkRequest &req, const QByteArray &data);};
QMap<QString,QThread*> sessionMap;SLOT void replyfinished(reply){ QString sessionKey = reply.getSessionKey(); //это вы должны подумать как идентифицировать сессии, проще всего какой то строкой в параметрах запроса QThread * replyProcessor = sessionMap.value(sessionKey); //ищем поток обработчик if(!replyProcessor) //если новая сессия { replyProcessor = new YourThhread(); //создаем обработчик connect(replyProcessor,SIGNAL(sendGet(..)),qnamOBject{объект в котором QNAM или непросредственно QNAM},SLOT(sendGet(..))); //соединяем обработчик что бы мог слать запросы sessionMap[sessionKey]=replyProcessor; //добавляем в мапу } YourEvent * e = new YourEvent(); //создаем событие e->setData(reply); //помещаем в него указатель на ответ sendEvent(replyProcessor,e); //шлем этому потоку (reply должен быть удалён в потоке обработчике через deleteLater после того как с него считано все что нужно)}
bool YourThread::event(QEvent * e){ if(e->type() == YourEvent_type) { YourEvent * ye = static_cast<YourEvent*>(e); QNetworkReply * reply = ye->replyPtr(); data = reply.data(); //QByteArray если не ошибаюсь //данные считаны, следует удалить ответ от сервера нам reply->deleteLater(); //обрабатываем данные ye->accept(); return true; //показывем что это соыбтие уже дальше обрабатывать ненадо } else return QThread::event(e);}