Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[cURL]Sprawdzanie szybkości pobierania pliku

Ostatnio zmodyfikowano 2013-09-24 12:50
Autor Wiadomość
maniek1310
Temat założony przez niniejszego użytkownika
[cURL]Sprawdzanie szybkości pobierania pliku
» 2013-09-15 13:40:09
Witam jest jakaś oddzielna funkcja pozwalająca sprawdzić z jaką prędkością pobierany jest plik z internetu ??

Tutaj mam moją funkcję pobierającą plik :
C/C++
void get_file( const char * url, const char * file_name, const char * mode )
{
    CURL * easyhandle = curl_easy_init();
    curl_easy_setopt( easyhandle, CURLOPT_URL, url );
    std::FILE * file = std::fopen( file_name, mode );
    curl_easy_setopt( easyhandle, CURLOPT_NOPROGRESS, 0 );
    curl_easy_setopt( easyhandle, CURLOPT_PROGRESSFUNCTION, progressbar );
    curl_easy_setopt( easyhandle, CURLOPT_WRITEDATA, file );
    curl_easy_perform( easyhandle );
    curl_easy_cleanup( easyhandle );
    fclose( file );
}
P-92161
pekfos
» 2013-09-15 13:50:21
Możesz, zamiast do pliku, przekazywać dane do funkcji (CURLOPT_WRITEFUNCTION), a tam bez problemu to obliczysz.
P-92163
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-15 14:01:31
Aktualnie mam zrobione z funkcją progressbar, tylko że nie wiem jak obliczyć prędkość z dltotal i dlnow.

curl_easy_setopt( easyhandle, CURLOPT_PROGRESSFUNCTION, progressbar );
funkcja progressbar
C/C++
int progressbar( void * clientp, double dltotal, double dlnow, double ultotal, double ulnow )
{
    int dltotalcalk =( dlnow * 100 ) / dltotal;
   
    dltotal /= 1024;
    dltotal /= 1024;
    dlnow /= 1024;
    dlnow /= 1024;
   
    std::ostringstream rozmiar( std::ostringstream::ate );
    std::ostringstream sciagnieto( std::ostringstream::ate );
    std::ostringstream ile_procent( std::ostringstream::ate );
   
    if( dltotal != 0 and dlnow != 0 )
    {
        rozmiar << dltotal;
        sciagnieto << dlnow;
        ile_procent << dltotalcalk;
       
        rozmiar << " mb";
        sciagnieto << " mb";
        ile_procent << " %";
    } else {
        rozmiar << "Rozpoczynanie";
        sciagnieto << "Rozpoczynanie";
        ile_procent << "0 %";
    }
   
    SetWindowText( hStatic4, rozmiar.str().c_str() );
    SetWindowText( hStatic6, sciagnieto.str().c_str() );
    SetWindowText( hStatic9, ile_procent.str().c_str() );
   
    SendMessage( hProgressBar, PBM_SETPOS,( WPARAM ) dltotalcalk, 0 );
   
    return 0;
}
P-92164
pekfos
» 2013-09-15 14:07:12
Licz czas między wywołaniami i ilość, w tym czasie, pobranych danych.
P-92165
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-15 14:21:05
Ciągle wyskakuje 0.

Tutaj kod:
C/C++
int progressbar( void * clientp, double dltotal, double dlnow, double ultotal, double ulnow )
{
    clock_t poczatek = obliczSekundy( clock() );
    double poczatek1 = dlnow;
    czekaj( 500 );
    double poczatek2 = dlnow;
    double roznica = poczatek2 - poczatek1;
   
    int dltotalcalk =( dlnow * 100 ) / dltotal;
   
    dltotal /= 1024;
    dltotal /= 1024;
    dlnow /= 1024;
    dlnow /= 1024;
   
    std::ostringstream rozmiar( std::ostringstream::ate );
    std::ostringstream sciagnieto( std::ostringstream::ate );
    std::ostringstream ile_procent( std::ostringstream::ate );
    std::ostringstream predkosc( std::ostringstream::ate );
   
    if( dltotal != 0 and dlnow != 0 )
    {
        rozmiar << dltotal;
        sciagnieto << dlnow;
        ile_procent << dltotalcalk;
        predkosc << roznica;
       
        rozmiar << " mb";
        sciagnieto << " mb";
        ile_procent << " %";
    } else {
        rozmiar << "Rozpoczynanie";
        sciagnieto << "Rozpoczynanie";
        ile_procent << "0 %";
    }
   
    SetWindowText( hStatic4, rozmiar.str().c_str() );
    SetWindowText( hStatic6, sciagnieto.str().c_str() );
    SetWindowText( hStatic9, ile_procent.str().c_str() );
    SetWindowText( hStatic8, predkosc.str().c_str() );
   
    SendMessage( hProgressBar, PBM_SETPOS,( WPARAM ) dltotalcalk, 0 );
   
    return 0;
}

void czekaj( int iMilisekundy )
{
    clock_t koniec = clock() + iMilisekundy * CLOCKS_PER_SEC / 1000.0;
    while( clock() < koniec ) continue;
   
}

double obliczSekundy( clock_t czas )
{
    return static_cast < double >( czas ) / CLOCKS_PER_SEC;
}
P-92166
pekfos
» 2013-09-15 14:25:37
Bo to tak nie działa..
P-92167
maniek1310
Temat założony przez niniejszego użytkownika
» 2013-09-15 14:58:01
A mógłby mi ktoś to przerobić , bo juz nie mam sił, ciągle pokazuje 0.
P-92168
pekfos
» 2013-09-15 15:01:46
Nikt tego za Ciebie nie zrobi. Twój kod nie działa, bo myślisz, że jak będziesz czekać, to dlnow, w jakiś magiczny sposób, zaktualizuje swoją wartość. Aby obliczyć różnicę, musisz mieć wartości dlnow z aktualnego i poprzedniego wywołania funkcji.
P-92169
« 1 » 2 3
  Strona 1 z 3 Następna strona