crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Парсинг ответов QNetworkAccessManager в разных потоках
DrWebber
  опции профиля:
сообщение 15.1.2015, 11:27
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.5.2012
Пользователь №: 3370

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет. Возник вопрос как правильно организовать обработку данных в разных потоках?

Есть вот такой класс(схематично):
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);


Экземпляров этого класса может быть....ну допустим 10. Я понимаю, что рекомендуется использовать 1 QNetworkAccessManager в приложении, но мне нужно чтобы запросы отправлялись через разные прокси.
Так же есть класс-генератор запросов, который вызывает функции sendGET и sendPOST, он работает в отдельном потоке QThread. Мне нужно чтобы данные, которые приходят в replyFinished обрабатывались параллельно, т.е. в данном случае в 10 потоков. Я пробовал создавать для каждого Requester свой QThread, но тогда я не мог вызывать из другого потока функции sendGET и sendPOST, вываливалось вот такое сообщение:
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();


Когда так делал, класс Requester выглядел немного по-другому - вся инициализация была в функции startInThread().

Собственно вопрос: как такое правильно реализовать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 20:49