Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [BC9] IdHTTP vs NMHHTP - Get()


Автор: MuForum 23.12.2008, 01:34
Доброе время суток!
- Работаю на 'C++ Builder 2009'; (Version 12.0.3170.16989)

# Задача: Скачать файл с интернета имея прямую ссылку на файл, также отображать в компоненте 'TCGauge' статистику скачивания.
- Проблема возникает в том, что скачивания происходит в контексте основного потока программы, таким образом во время скачивания файла основная программа подгружается.
- На 'C++ Builder 6' для таких целей использовал компонент 'TNMHTTP', но к сожалению на 9 его убрали(вообще все компоненты этой линейки).
- TNMHTTP скачивал файлы не в контексте основного потока, тем самым не подгружая основной поток программы. (То есть, как раз удовлетворял потребности)

Код

bool __fastcall TFFUpdate::DownloadFile(UnicodeString URLPath, UnicodeString FilePath)
{
    ...
    try
    {
        TFileStream *file_str = new TFileStream(FilePath, fmCreate);
        IdHTTP1->Get(URLPath, file_str);
        file_str->Free();
    }
    catch(Exception &e)
    {
        UnicodeString msg = e.ClassName();
        msg += ": " + e.Message;
        WLog(1, msg);
    }
    ...
}
//---------------------------------------------------------------------------

void __fastcall TFMain::IdHTTP1Work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
{
    CGauge1->Progress = AWorkCount;
}
//---------------------------------------------------------------------------

void __fastcall TFMain::IdHTTP1WorkBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax)
{
    CGauge1->MaxValue = AWorkCountMax;
}
//---------------------------------------------------------------------------

- Файл скачивается успешно, с этим проблем нету.


# Вопрос: Как решить проблему с подгружением основного потока во время скачивания файла с хостинга?
- В свойствах компонента не нашел свойства, которое хоть как бы говорило мне об этом.

Автор: mrbrooks 23.12.2008, 09:40
Цитата(MuForum @  23.12.2008,  01:34 Найти цитируемый пост)
 Как решить проблему с подгружением основного потока во время скачивания файла с хостинга?

не совсем понял о чем ты. гуй зависает чтоли? если так - кинь на форму TIdAntiFreeze.

Автор: MuForum 23.12.2008, 18:11
# 2, mrbooks - Благодарю за подсказку.


# http://www.lib.csu.ru/dl/bases/prg/kompress/articles/2002_03_indy/#31:
Цитата

Вследствие блочной организации алгоритмов компонентов Indy зачастую создается впечатление, что приложение «зависло», в то время как соединение работает. Чтобы исключить использование вторичных процессов (threads) при организации коммуникаций для предотвращения замораживания (freeze) приложения, достаточно поместить на форму указанный компонент.

Компонент работает, анализируя запросы из стека протокола TCP/IP и посылая сообщения приложению во время задержки при возникновении блокировки внешних соединений, что создает иллюзию работающего кода. Поскольку воздействие компонента осуществляется на блокированные соединения только для главного процесса, использование TIdAntiFreeze во вторичных процессах приложения не требуется. Необходимо помнить, что компонент TIdAntiFreeze замедляет работу соединений, поскольку работа главного процесса периодически прерывается для обработки сообщений. Отсюда следует, что надо заботиться о том, чтобы разрабатываемое приложение не тратило слишком много времени на обработку сообщений, включая OnClick, OnPaint, OnResize и др. В какой-то степени этим можно управлять через свойства класса TIdAntiFreeze. Использование данного компонента не является обязательным, но позволяет решить проблему синхронизации соединений с визуальным интерфейсом приложения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)