Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128

IdHTTP->Get в потоке и прогрессом

29.08.2012, 17:39. Показов 9563. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TIdHTTP *HTTP = new TIdHTTP(NULL);
    if (HTTP) {
        try {
            HTTP->ConnectTimeout = 10000;
            HTTP->ReadTimeout = 10000;
            if (HTTP->Connected()) HTTP->Disconnect();
            html = HTTP->Get("http://checkip.dyndns.com/");
        }
        catch (...) {} //Соединение не установлено
        try {HTTP->Socket->Close();}
        catch (...) {HTTP->Disconnect();}
        delete HTTP;
        HTTP = NULL;
    }
Хочу засунуть его в поток, получаем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
String html;
 
void __fastcall Th::Execute()
{
    int p1, p2;
    TIdHTTP *HTTP = new TIdHTTP(NULL);
    if (HTTP) {
        try {
            HTTP->ConnectTimeout = 10000;
            HTTP->ReadTimeout = 10000;
            if (HTTP->Connected()) HTTP->Disconnect();
            html = HTTP->Get("http://checkip.dyndns.com/");
        }
        catch (...) {} //Соединение не установлено
        try {HTTP->Socket->Close();}
        catch (...) {HTTP->Disconnect();}
        delete HTTP;
        HTTP = NULL;
    }
    p1 = html.Pos("Address:")+9;
    p2 = html.Pos("</body>");
    html = html.SubString(p1,p2-p1);
    Synchronize(&UpdateMemo);
}
 
void __fastcall Th::UpdateMemo()
{
        Form1->Memo1->Lines->Add("WAN IP: " + html);
}
Вроде работает, но как сделать прогресс? На форме это делалось добавлением TIdHTTP на форму и там в Event'ах выставлялись функции... А вот в потоке как их создать я не догнал... ?
Пример Event'ов для IdHTTP из формы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
void __fastcall TForm1::work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
{
    Form1->Memo1->Lines->Add(AWorkCount);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::workBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax)
{
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::workEnd(TObject *ASender, TWorkMode AWorkMode)
{
 
}
//---------------------------------------------------------------------------
//В Unit1.h:
void __fastcall work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount);
void __fastcall workBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax);
void __fastcall workEnd(TObject *ASender, TWorkMode AWorkMode);


И пару вопросов по потокам:
  • String html пришлось сделать глобальной - есть ли другие варианты для передачи в Synchronize()?
  • Если я из потока вызываю функцию, которая написана в Unit1 (т.е. она не относится к потоку) - она же будет потом работать в этом потоке? (главное убрать из функции контакт с формой?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2012, 17:39
Ответы с готовыми решениями:

Как ускорить чтение с прогрессом в потоке
Есть класс Reader который читает содержимое файлов в DataTable. Но есть проблема. Если мы Дергаем делегат прогресса из цикла чтения то это...

Отправка вайла в потоке idhttp
Ребят, загрузчик файлов на сервер через idhttp + idmultipartformdata работает на ура. Но есть проблема - нужно сделать загрузку в...

idhttp в потоке получает пустой txt файл
Доброго времени суток. Пишу обновлялку для программы. Собственно, если код вставлен в FormCreate - все работает. Если же вставить в...

45
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2012, 23:00
Студворк — интернет-сервис помощи студентам
Ну есть еще кажется Indy поток - класс, даже не простоо класс -а компонент... TIdThreadComponent
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
31.08.2012, 23:17  [ТС]
А в момент получения потоком страницы его, получается, никак не прервать?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2012, 23:18
Кого ?
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 15:57  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Кого ?
Поток

Добавлено через 16 часов 32 минуты
Навешал кучу проверок Terminated и теперь во время загрузки страницы в функции OnWork() постоянно идет проверка на Terminated, если затерминировано, то закрываю сокет, ловлю исключение и возвращаю поток.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.09.2012, 02:05
Навешал кучу проверок Terminated и теперь во время загрузки страницы в функции OnWork() постоянно идет проверка на Terminated, если затерминировано, то закрываю сокет, ловлю исключение и возвращаю поток.
Может быть есть другой способ остановки загрузки...

Добавлено через 8 часов 29 минут
На форумах видел используют IdHTTP1->Disconnect();

AWorkMode отвечает за передачу/получение данных

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------------------------------------------------------------
void __fastcall TMyThread::WorkBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax)
{
if(AWorkMode == wmRead) // Если скачиваем   ( wmWrite передача данных - запрос )
    {
     Max= AWorkCountMax;
     Synchronize(ProgressBegin);
    }
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
{
if (Terminated)   dynamic_cast<TIdHTTP*>(ASender)->Disconnect(); 
 
if(AWorkMode == wmRead) // Если скачиваем
  {  
   Current =  AWorkCount;
   Synchronize(Progress);
  }
}
//---------------------------------------------------------------------------
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
02.09.2012, 02:27  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
IdHTTP1->Disconnect();[/CPP]
IdHTTP1->Socket->Close() используемый мной практически равносилен.
Кстати насчет "ловим исключение" я ошибся, видимо с чем-то другим спутал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2012, 02:27

Отправка картинки IdHTTP POST в потоке TMemoryStream
Получаю я картинку(капча) в поток(TMemoryStream) посредством запроса. Потом мне нужно эту картинку отправить на сервис, вот тут я...

IdHTTP и IdHTTP сервер: как отправить сообщение от сервера к клиенту?
Всем привет, отправляю файл по частям с клиента на сервер, и хочу получать обратное сообщение, что текущая часть файла дошла успешно....

Скачивание файла с прогрессом
Привет. Есть на HTTP сервере файл &gt; 10 MB надо его скачать. URL url = new URL(...); File file = new File(getApplicationDir(),...

Очистка папки с прогрессом
Очистка папки с прогрессом. Здравствуйте! Необходимо сделать так что-бы при очистке какой-либо папки был прогресс выполнения данной...

Скачивание файла с прогрессом
Ставлю на загрузку файл. Хочу чтобы отображался прогресс скачивания. Программа тупо зависает до момента окончания скачивания private...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru