Название: Парсинг ответов QNetworkAccessManager в разных потоках Отправлено: DrWebber от Январь 15, 2015, 06:03 Всем привет. Возник вопрос как правильно организовать обработку данных в разных потоках?
Есть вот такой класс(схематично): Код: class Requester : public QObject Экземпляров этого класса может быть....ну допустим 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. Создавал вот так: Код: Requester *requester = new Requester(); Когда так делал, класс Requester выглядел немного по-другому - вся инициализация была в функции startInThread(). Собственно вопрос: как такое правильно реализовать? Название: Re: Парсинг ответов QNetworkAccessManager в разных потоках Отправлено: Fregloin от Январь 15, 2015, 11:30 Код: class Requester : public QObject Ваши потоки должны быть как то так Код: class ReplyThread : public QThread { Код: Requester *requester = new Requester(); //выполняется допустим в главном потоке, или в отдельном потоке Ну и конечно еще нужно вам в слоте SLOT(replyFinished(QNetworkReply*)) узнать какому потоку передать ответ (если потоки живут между ответами от сервера, а не создаются каждый раз) Название: Re: Парсинг ответов QNetworkAccessManager в разных потоках Отправлено: DrWebber от Январь 15, 2015, 12:17 А если вот так, без лишних классов? И за replyFinished переживать вроде не надо.
Код: class Requester : public QObject Ну и все это в QThread. А потом где-то: emit requester->sendGET(...); Прокатит такой вариант, как считаете? Просто попробовать не могу сейчас. Название: Re: Парсинг ответов QNetworkAccessManager в разных потоках Отправлено: Fregloin от Январь 16, 2015, 12:54 то что вы написали будет работать в одном потоке, работать то оно будет конечно, но это не то что вы ожидаете. я же вам показал упрощенный код, который должен работать как надо, есть объект который содержит в себе QNAM, и есть куча порождаемых потоков, которые подключаются сигналами и слотами к одному экземпляру в QNAM, который живет в отдельном потоке.
Если сессия состоит из "запрос - ответ - поток - завершение потока" то проще наверное воспользоваться пулом потоков, когда на каждый ответ порождается новый поток, обрабатывается ответ и удалется поток. Если поток должен жить между запросами и ответами, то нужно так же хранить мапу вида <QString,QThread> где ключ - это айпишник с которого пришёл ответ (или другой ключ известный вам идентифицирующий сессию), а QThread - ваш поток-обработчик. Сответственно поток знает как отправить запрос, т.к. его сигнал sendGet/sendPost подключен к единственному экземпляру QNAM, а вот QNAM у нужно уже отправлять ответы отдельным потокам. connect тут уже не прокатит, т.к. через него нельзя указать конкретный поток с конкреным сигналом (а точнее его содержимым). Тут нужно слать Евенты каждому конкретному потоку. Например так Код:
в потоке обработчике нужно переопределить метод event() Код: bool YourThread::event(QEvent * e) |