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
  опции профиля:
сообщение 18.1.2015, 16:58
Сообщение #2


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

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

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




Репутация:   8  


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

Вы бенчмарк делали?
А как же переключение потоков? У вас же не 10 процессоров.

Если данные у вас обрабатываются так долго, что один поток не успевает их разобрать между приходами запросов, то 10 потоков вас не спасут, все время будет копится очередь необработанных запросов.

Почитайте например тут
http://programmers.stackexchange.com/quest...e-thread-cannot
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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


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