tomcionek15 Temat założony przez niniejszego użytkownika |
[URLDownloadToFile] Jak wykonać 'progressbara' obrazującego postęp pobrania pliku? » 2012-02-11 17:12:59 Witam dzisiaj jeszcze z pomoca tego forum udalo mi sie zrobic poobieranie pliku. A moje pytanie brzmi jak wykonac progress bar'a to pobieranego pliku w sensie ze pokazuje np tak : |========== | 36% moj obecny kod to : #include <iostream> #include <conio.h> #include <urlmon.h> #include <string> #pragma comment(lib, "urlmon.lib")
using namespace std;
void Pobierz( string link, string fol_docel ) { string link_s = link; string save_s = fol_docel; if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, NULL ) == S_OK ) { cout << "Pobieranie pliku : \n" << link << " \n Zakonczone pomyslnie. "; } else { cout << "Pobieranie pliku : \n" << link << " \n Zakonczone NIEpowodzeniem. "; } } int main() { string links; string fol_doc; cout << "Podaj link do pliku : "; cin >> links; cout << endl << "Podaj Folder docelowy(+nazwa pliku i .rozszerzenie): "; cin >> fol_doc; cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl; Pobierz( links, fol_doc ); getch(); }
I chcialbym zeby bylo w linijce : cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl;
zamaist tych endl po "Czekaj, twa pobieranie pliku ", byl ten progress bar :D Z groy dziekuje pozdrawiam :D |
|
pekfos |
» 2012-02-11 17:21:30 A może by tak poczytać dokumentację urlmona? Jak o wszystko chcesz pytać to daruj sobie.. |
|
tomcionek15 Temat założony przez niniejszego użytkownika |
» 2012-02-11 17:50:27 Gdyby na forum byla ta dkomentacja Daje 'Dokumntacja' i szukam urlmon -> Nie ma szukam w Google -> Nie ma |
|
malan |
» 2012-02-11 18:10:03 To jest do zrobienia za pomocą URLDownloadToFile, ale musisz wiedzieć m.in co to są: klasy, dziedziczenie, metody wirtualne, interface i jak się tym poprawnie posługiwać. |
|
tomcionek15 Temat założony przez niniejszego użytkownika |
» 2012-02-12 10:54:28 #include <iostream> #include <conio.h> #include <urlmon.h> #include <string> #include <cstdlib> #pragma comment(lib, "urlmon.lib")
using namespace std;
string nazwa_pliku; class MyCallback : public IBindStatusCallback { public: MyCallback() { } ~MyCallback() { } STDMETHOD( OnProgress )( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR wszStatusText ) { if( ulStatusCode != 5 ) { cout << "Czekaj, trwa sprawdzanie pliku. : " << nazwa_pliku << "\r"; return S_OK; } else { cout << "Pobrano " << ulProgress / 1024 << " KB z " << ulProgressMax / 1024 << " KB, Nazwa Pliku = " << nazwa_pliku << ", Status Code = " << ulStatusCode << "\r"; return S_OK; } } STDMETHOD( OnStartBinding )( DWORD dwReserved, IBinding __RPC_FAR * pib ) { return E_NOTIMPL; } STDMETHOD( GetPriority )( LONG __RPC_FAR * pnPriority ) { return E_NOTIMPL; } STDMETHOD( OnLowResource )( DWORD reserved ) { return E_NOTIMPL; } STDMETHOD( OnStopBinding )( HRESULT hresult, LPCWSTR szError ) { return E_NOTIMPL; } STDMETHOD( GetBindInfo )( DWORD __RPC_FAR * grfBINDF, BINDINFO __RPC_FAR * pbindinfo ) { return E_NOTIMPL; } STDMETHOD( OnDataAvailable )( DWORD grfBSCF, DWORD dwSize, FORMATETC __RPC_FAR * pformatetc, STGMEDIUM __RPC_FAR * pstgmed ) { return E_NOTIMPL; } STDMETHOD( OnObjectAvailable )( REFIID riid, IUnknown __RPC_FAR * punk ) { return E_NOTIMPL; } STDMETHOD_( ULONG, AddRef )() { return 0; } STDMETHOD_( ULONG, Release )() { return 0; } STDMETHOD( QueryInterface )( REFIID riid, void __RPC_FAR * __RPC_FAR * ppvObject ) { return E_NOTIMPL; } }; MyCallback pCallback; void Pobierz( string link, string fol_docel ) { string link_s = link; string save_s = fol_docel; if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, & pCallback ) == S_OK ) { cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Pomyslnie. \n"; } else { cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Niepowodzeniem. \n"; } } int main() { string links; string fol_doc; cout << "Podaj link do pliku : "; cin >> links; cout << endl << "Podaj Folder docelowy : "; cin >> fol_doc; cout << "Podaj nazwe pliku(+ .rozszerzenie) : "; cin >> nazwa_pliku; cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl; fol_doc += nazwa_pliku; Pobierz( links, fol_doc ); system( "PAUSE" ); return 0; }
Mam taki kod i narazie wszystko dziala tylko za chiny nie wiem jak zrobic ten progress bar |======== | 36% |
|
szyx_yankez |
» 2012-02-12 11:26:05 Mając informacje o rozmiarze pliku i aktualnym stanie można to zrobić bardzo prosto, kłania się podstawowa znajomość pętli i matematyki, np:
#include <iostream> #include <windows.h>
using namespace std;
float ulProgressMax = 10000; float ulProgress = 0;
int IL = 50; int main() { while( true ) { ulProgress++; cout << "|"; for( int i = 0; i < int( ulProgress / ulProgressMax * IL ); i++ ) cout << "="; for( int i = int( ulProgress / ulProgressMax * IL ); i < IL; i++ ) cout << " "; cout << "|"; cout << int( ulProgress / ulProgressMax * 100 ) << "%\r"; Sleep( 1 ); if( ulProgress >= ulProgressMax ) break; } cout << "Pobrano!"; Sleep( 2000 ); return 0; } |
|
tomcionek15 Temat założony przez niniejszego użytkownika |
» 2012-02-12 14:05:26 Dzięki działa ale mam problem :
#include <iostream> #include <conio.h> #include <urlmon.h> #include <string> #include <cstdlib> #pragma comment(lib, "urlmon.lib")
using namespace std; int IL = 60; string nazwa_pliku; string links; string fol_doc; float upr; float uprm;
class MyCallback : public IBindStatusCallback { public: MyCallback() { } ~MyCallback() { } STDMETHOD( OnProgress )( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR wszStatusText ) { if( ulStatusCode != 5 ) { cout << "Czekaj, trwa sprawdzanie pliku. : " << nazwa_pliku << "\r"; return S_OK; } else { cout << "\nPobrano " << ulProgress / 1024 << " KB z " << ulProgressMax / 1024 << " KB, Nazwa Pliku = " << nazwa_pliku << ", Status Code = " << ulStatusCode << "\r"; cout << endl; while( true ) { upr = ulProgress; uprm = ulProgressMax; upr++; cout << "|"; for( int i = 0; i < int( upr / uprm * IL ); i++ ) { cout << "="; } for( int i = int( upr / uprm * IL ); i < IL; i++ ) { cout << " "; } cout << "|"; cout << int( upr / uprm * 100 ) << "%" << "\r"; if( upr >= uprm ) break; Sleep( 1 ); return S_OK; } return S_OK; } } STDMETHOD( OnStartBinding )( DWORD dwReserved, IBinding __RPC_FAR * pib ) { return E_NOTIMPL; } STDMETHOD( GetPriority )( LONG __RPC_FAR * pnPriority ) { return E_NOTIMPL; } STDMETHOD( OnLowResource )( DWORD reserved ) { return E_NOTIMPL; } STDMETHOD( OnStopBinding )( HRESULT hresult, LPCWSTR szError ) { return E_NOTIMPL; } STDMETHOD( GetBindInfo )( DWORD __RPC_FAR * grfBINDF, BINDINFO __RPC_FAR * pbindinfo ) { return E_NOTIMPL; } STDMETHOD( OnDataAvailable )( DWORD grfBSCF, DWORD dwSize, FORMATETC __RPC_FAR * pformatetc, STGMEDIUM __RPC_FAR * pstgmed ) { return E_NOTIMPL; } STDMETHOD( OnObjectAvailable )( REFIID riid, IUnknown __RPC_FAR * punk ) { return E_NOTIMPL; } STDMETHOD_( ULONG, AddRef )() { return 0; } STDMETHOD_( ULONG, Release )() { return 0; } STDMETHOD( QueryInterface )( REFIID riid, void __RPC_FAR * __RPC_FAR * ppvObject ) { return E_NOTIMPL; } }; MyCallback pCallback;
void sciezka( string fol_doc, string nazwa_pliku ) { string sciezka = fol_doc += nazwa_pliku; cout << "\n\n Plik zostal pobrany do : " << sciezka; }
void Pobierz( string link, string fol_docel ) { string link_s = link; string save_s = fol_docel; if( URLDownloadToFileA( NULL, link_s.c_str(), save_s.c_str(), 0, & pCallback ) == S_OK ) { cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Pomyslnie. \n"; sciezka( fol_doc, nazwa_pliku ); } else { cout << "\nPobieranie pliku : " << nazwa_pliku << " Zakonczone Niepowodzeniem. \n"; } }
int main() { cout << "Podaj link do pliku : "; cin >> links; cout << endl << "Podaj Folder docelowy : "; cin >> fol_doc; cout << "Podaj nazwe pliku(+ .rozszerzenie) : "; cin >> nazwa_pliku; cout << endl << endl << "Czekaj, trwa pobieranie pliku " << endl << endl; fol_doc += nazwa_pliku; Pobierz( links, fol_doc ); system( "PAUSE" ); return 0; }
Działa ale jest pewny problem .....
pokazuje :
Pobrano 565kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|======================== |56%
Pobrano 665kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|============================== |66%
Pobrano 695kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|================================ |70%
Pobrano 765kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|================================== |76%
Pobrano 795kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|==================================== |79%
Pobrano 855kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|======================================== |85%
Pobrano 965kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|============================================= |96%
A chce zeby to pokazywalo caly czas w 2 linijkach:
Pobrano 565kb z 1000kb, nazwa pliku = plik.exe, Status Code = 5,
|======================== |56%
P.S : Nie dziala to : cout <<[..] << "\r";
Sorka że to tak pokazuje ale normalnie to jest [równe] |
|
szyx_yankez |
» 2012-02-12 14:32:41 Czyść ekran za każdym obiegiem pętli... |
|
« 1 » 2 |