Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прога подвисает при скачивании файла с инета 
:(
    Опции темы
RDC
  Дата 9.1.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



Пользуюсь вот таким кодом для скачивания файла с инета:
Код

#include <urlmon.h>
#pragma comment (lib, "urlmon.lib")    // $(BCB)\lib\psdk
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HRESULT hr = URLDownloadToFile(0, "http://www.somenet.com/file_to_download.zip", "C:\\file_to_download.zip", 0, 0);
    if(FAILED(hr)) {
        ShowMessage(SysErrorMessage(hr));
    }
}


На время скачивания програ встаёт в ступор и кажется что она повисла, но стоит подождать пару минут и файл скачивается и прога дальше работает. Как убрать висняк?

PS Использовать TIdHTTP  НЕ ПРЕДЛАГАТЬ!
--------------------
Живопись
PM MAIL   Вверх
586
Дата 9.1.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Создай поток (thread).
PM   Вверх
TiKKi
Дата 9.1.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: 1
Всего: 2



Чем этот вариант плох?
PM   Вверх
RDC
  Дата 10.1.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 26.1.2008

Репутация: нет
Всего: нет



TiKKi, вариант хорош, только не пойму как там отследить что скачиваемого файла не существует?
--------------------
Живопись
PM MAIL   Вверх
TiKKi
Дата 11.1.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: 1
Всего: 2



Цитата(RDC @ 9.1.2009,  18:15)
На время скачивания програ встаёт в ступор и кажется что она повисла, но стоит подождать пару минут и файл скачивается и прога дальше работает. Как убрать висняк?

GetTarget.h:
Код

//---------------------------------------------------------------------------

#ifndef GetTargetH
#define GetTargetH

#include <Classes.hpp>
#include <Dialogs.hpp>

//---------------------------------------------------------------------------

class TGetTarget : public TThread
{
    private:
        AnsiString FTarget,
                   FFileName,
                   FMessage;

        void __fastcall ShowMsg()
        {
            ShowMessage( FMessage );
        }

    protected:
        void __fastcall Execute();

    public:
             __fastcall TGetTarget( bool CreateSuspended ) : TThread( CreateSuspended ) {};

    __property
        AnsiString Target = { read = FTarget, write = FTarget };

    __property
        AnsiString FileName = { read = FFileName, write = FFileName };
};

//---------------------------------------------------------------------------

#endif

GetTarget.cpp:
Код

//---------------------------------------------------------------------------

#include <urlmon.h>
#pragma hdrstop

#include "GetTarget.h"

//---------------------------------------------------------------------------

#pragma comment(lib, "urlmon.lib")
#pragma package(smart_init)

//---------------------------------------------------------------------------

void __fastcall
        TGetTarget :: Execute()
{
    HRESULT hResult = URLDownloadToFile( 0, FTarget.c_str(), FFileName.c_str(), 0, 0 );
    if( hResult != S_OK )
    {
        FMessage = "Error!";
    } else
    {
        FMessage = "Ok!";
    }
    Synchronize( &ShowMsg );
}

//---------------------------------------------------------------------------


Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TGetTarget *GetTarget = new TGetTarget( true );
    GetTarget->FreeOnTerminate = true;
    GetTarget->FileName = "C:\\menu.gif";
    GetTarget->Target = "http://forum.vingrad.ru/style_images/2/menu/menu.gif";
    GetTarget->Resume();
}

Цитата(RDC @ 10.1.2009, 22:07)
...как там отследить что скачиваемого файла не существует...

Интересно, есть над чем подумать на досуге.

PM   Вверх
586
Дата 11.1.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(RDC @  10.1.2009,  22:07 Найти цитируемый пост)
TiKKi, вариант хорош, только не пойму как там отследить что скачиваемого файла не существует? 

В том примере это как раз реально. После InternetOpenUrl вызови InternetGetLastResponseInfo или HttpQueryInfo HTTP_QUERY_STATUS_CODE (вариант с HttpQueryInfo я тестировал раньше - работает: 200 - OK, 404 - файл не найден, 403 - отказано в доступе (HTTP Status Codes)).
PM   Вверх
TiKKi
Дата 12.1.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.5.2006

Репутация: 1
Всего: 2



Цитата(586 @ 11.1.2009,  22:40)

HttpQueryInfo HTTP_QUERY_STATUS_CODE (вариант с HttpQueryInfo я тестировал раньше - работает: 200 - OK, 404 - файл не найден, 403 - отказано в доступе (HTTP Status Codes)).

Ага, я тоже вчера функцию HttpQueryInfo прикрутил, вот что у меня получилось:
Код

void __fastcall WebThread::Execute()
{
    // Session
    HINTERNET FSession = InternetOpen("Dummy", INTERNET_OPEN_TYPE_PRECONFIG,
      NULL, NULL, 0);
    // Error
    if (!FSession) return;

    HINTERNET FURL = InternetOpenUrl(FSession, URL.c_str(), NULL, 0,
      INTERNET_FLAG_RELOAD, 0);
    // Error
    if (!FURL) {
        InternetCloseHandle(FSession);
        return;
    }

    DWORD    Code = 0,
            Size = sizeof( Code );
    if ( !HttpQueryInfo( FURL, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, ( LPVOID ) &Code, ( LPDWORD  ) &Size, NULL  ) )
    {
        InternetCloseHandle( FSession );
        InternetCloseHandle( FURL );
        return;
    } else if ( Code == 404 )
    {
//        Тут прикрутить сообщение с использованием Synchronize - файл не сущестует...
        InternetCloseHandle( FSession );
        InternetCloseHandle( FURL );
        return;
    }

    // Set Pointer
    InternetSetFilePointer(FURL, 0, NULL, FILE_BEGIN, 0);
    TFileStream *FStream = new TFileStream(FileName, fmCreate);
    __try
    {
       DWORD BytesRead;
       char Buf[1024];
       do{
            if (InternetReadFile(FURL, Buf, sizeof(Buf) - 1, &BytesRead)){
                FStream->WriteBuffer(Buf, BytesRead);
            }
       }while (BytesRead != 0);
    }
    __finally
    {
        delete FStream;
        InternetCloseHandle(FSession);
        InternetCloseHandle(FURL);
    }
    Synchronize(&UpdateMethod);
}

Цитата(586 @ 11.1.2009,  22:40)

InternetGetLastResponseInfo

С помощью функции  InternetGetLastResponseInfo не получится, так как она используется когда GetLastError возвращает  ERROR_INTERNET_EXTENDED_ERROR. Если же файла не существует, то InternetOpenUrl все равно не вернет NULL, следовательно GetLastError вернет ноль.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.