crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Http и потоки, Ищу исходники
bo0blik
  опции профиля:
сообщение 1.10.2009, 17:40
Сообщение #1


Студент
*

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

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




Репутация:   0  


Буду рад если кто-то поделится исходниками на эту тему, очень интересно посмотреть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 1.10.2009, 20:32
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3258
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


А что именно интересует?
В том, чтобы самому писать, ничего сложного нет! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 1.10.2009, 20:48
Сообщение #3


Студент
*

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

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




Репутация:   0  


Я просто из тех людей которые пока не увидят код, ничего не поймут.

Просто интересует распределенная много-поточная отправка http запросов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 1.10.2009, 21:52
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

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




Репутация:   1  


Вот примерчик. Набор классов для выполнения разных типов запросов с разными параметрами. Примеры использования:
GET:
WebGetRequest *g = new WebGetRequest(QUrl("http://www.google.ru"),"./check_internet.xml");
connect(g,SIGNAL(done(WebReply)),this,SLOT(check_internet_done(WebReply)));
connect(g,SIGNAL(offline()),this,SLOT(internet_offline()));
g->run();

POST:
QFile file("C:/image.jpeg");
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
file.close();
WebPostRequest *p = new WebPostRequest(QUrl("http://send.photo.here.com"),"image/jpeg",data,data.size(),"answer.xml");
connect(p,SIGNAL(done(WebReply)),this,SLOT(send_image_done(WebReply)));
connect(p,SIGNAL(offline()),this,SIGNAL(not_connected()));
p->run();


Заботиться больше ни о чём (в т.ч. об удалении экзепляров) не нужно, в принципе, даже ответ обрабатывать необязательно, т.е. можно сразу после создания объекта вызывать run. Естественно, обработка любого числа запросов будет происходить параллельно. Плюс имеются сигналы разные (download/upload progress, errors, etc.). И пустые слоты, которые можно заполнить на свой вкус)

И ещё - НЕ используй QHttp. Мои классы написаны на основе QNetworkAccessManager

Сообщение отредактировал Elfinit - 1.10.2009, 21:58
Прикрепленные файлы
Прикрепленный файл  pA_Web.zip ( 2.57 килобайт ) Кол-во скачиваний: 56
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bo0blik
  опции профиля:
сообщение 2.10.2009, 4:43
Сообщение #5


Студент
*

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

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




Репутация:   0  


Elfinit, спасибо большое, про http я уже досконально изучил, просто интересно как это правильней всего с потоками выглядит.

Я посмотрел класс, очень интересный пример.

Если у кого еще есть что-нибудь буду очень благодарен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 2.10.2009, 22:49
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

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




Репутация:   1  


Цитата(bo0blik @ 2.10.2009, 5:43) *
Elfinit, спасибо большое, про http я уже досконально изучил, просто интересно как это правильней всего с потоками выглядит.

Я посмотрел класс, очень интересный пример.

Если у кого еще есть что-нибудь буду очень благодарен.

Ммм...А зачем вообще париться с потоками в данном случае, за тебя всё библиотека сделает..Главное-инициировать запрос и в нужное время отреагировать на ответ..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 6.10.2009, 20:36
Сообщение #7


Студент
*

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

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




Репутация:   0  


сегодня тоже провозился пол-дня. Пытался сделать из асинхронного режима запросов синхронный, для чего пускал qttp в отдельном потоке - так и не удалось победить - вешается зараза в WaitForMultipleObjects
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.10.2009, 21:12
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(rnd @ 6.10.2009, 21:36) *
сегодня тоже провозился пол-дня. Пытался сделать из асинхронного режима запросов синхронный, для чего пускал qttp в отдельном потоке - так и не удалось победить - вешается зараза в WaitForMultipleObjects

Как-то связи синхронного режима с отдельным потоком не понял?

Вот набросок кода, думаю идея должна быть понятна:
QByteArray loader()
{
        QHttp http;
        http.setHost( ... );
        http.get( ... );

        while( http.state() != QHttp::Closing )
                QApplication::processEvents();

        return http.readAll();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 7.10.2009, 8:32
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Для того, что бы сделать работу QHttp синхронной, нужно что бы отрабатывали QSocketNotifier. Для этого нужно крутить eventloop (именно там происходят необходимые действия). Предыдущий пример показывал саму идею, "боевой" код я бы сделал примерно таким:
QByteArray loader()
{
        QHttp http;
        QEventLoop loop;
        QObject::connect( &http, SIGNAL( done( bool ) ), &loop, SLOT( quit() ) );

        http.setHost( ... );
        http.get( ... );
        loop.exec();
    // выходим из цикла при получении сигнала QHttp::done

    // Проверили ошибки....
        qDebug() << http.state() << http.error() << http.bytesAvailable();
        return http.readAll();
}


Если необходимо сделать отдельный поток, который делает запрос и получает/обрабатывает ответ, то такой код можно использовать и в методе run потока.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 7.10.2009, 12:57
Сообщение #10


Студент
*

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

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




Репутация:   0  


BRE, то, что вы предлагаете - очень опасная практика. Начнут прокачиваться сообщения, т.е. вызываться слоты\обработчики, которые в данный момент времени (посреди работы функции) вызываться совершенно не должны.

Именно поэтому и создается отдельный поток, в который засовывается(moveToThread) объект QNetworkAccessManager там для него и идет прокачка сообщений, а вызывающий поток ждет.

Вчерашняя проблема решилась заменой QHttp на QNetworkAccessManager:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.4.2017, 8:25