crossplatform.ru

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

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().

Собственно вопрос: как такое правильно реализовать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 16.1.2015, 9:19
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

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




Репутация:   8  


А зачем вообще треды? Создайте 10 экземпляров в одном потоке.
QnetworkAccessManager работает асинхронно, поэтому проблем никаких не будет. В этом же потоке обрабатывайте данные по мере поступления.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DrWebber
  опции профиля:
сообщение 18.1.2015, 15:31
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(lanz @ 16.1.2015, 9:19) *
А зачем вообще треды? Создайте 10 экземпляров в одном потоке.
QnetworkAccessManager работает асинхронно, поэтому проблем никаких не будет. В этом же потоке обрабатывайте данные по мере поступления.


В том-то и дело, что мне нужно чтобы данные обрабатывались в разных потоках, это существенно существенно увеличит производительность. Хоть QnetworkAccessManager и работает асинхронно, ответы все равно будут обрабатываться последовательно, а меня это не устраивает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.4.2025, 2:32