DownloadFile progress – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

DownloadFile progress – C / C++ – Fórum – Programujte.comDownloadFile progress – C / C++ – Fórum – Programujte.com

 

Ivo
~ Anonymní uživatel
93 příspěvků
1. 3. 2013   #1
-
0
-

Ahoj, tak Mně tu máte zase, po tom co jsem se prokousal ctenim hodnoty z IDC_EDIT, zvladl jsem MultiThreaing 

example

_beginthreadex( 0,0, &Updaterxxx, this, 0, 0 );

unsigned int __stdcall CProjectDlg::Updaterxxx( void * param )
{

}

jsem narazil na dalsi oříšek se kterým neumím hnout..

a to jak zobrazit progress stahování.. zkoušel jsem různý návody na to jak udělat progressbar ale asi jsem blbej.. úplně by mi stačilo kdyby to jako status vracelo

GetDlgItem(IDC_BUTTON4)->SetWindowTextA("Staženo xxx procent...");

nic víc nic míň.. ale prostě nejsem schopnej to zprovoznit.. pomůže mi někdo pěkně prosím?

funkce kterou používám pro stahování pochází odtud kdysi před několika lety mi tu s tím někdo pomohl:

BOOL DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{  
	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;
	if( nError  == ERROR_SUCCESS )
	{  
		hInet = InternetOpen(lpAppName,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);
			if( hInet == INVALID_HANDLE_VALUE )
				nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,0,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
    }
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];

		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

return (BOOL) nError == ERROR_SUCCESS;
}

volá se to :

char Adresa[]="http://www............./.../.../neco.koncovka";

DownloadFile(Adresa, "lokalni_soubor.koncovka")

nebyl by ani velký problém použít

URLDownloadToFile( NULL, string("http://www......we/neco.zip").c_str(), string("neco.zip").c_str(), 0, NULL);

Děkuji za radu nebo nějaký srozumitelný example.. 

Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
2. 3. 2013   #2
-
0
-

#1 Ivo
Pomocí HttpQueryInfo (s parametrem HTTP_QUERY_CONTENT_LENGTH) s zjisíš celkovou velikost souboru na webu a v tom while cyklu kde voláš InternetReadFile (budeš si ukládat celkové již načtené bajty) budeš aktualizovat progressbar a to tak že na začátku mu pomocí zprávy PBM_SETRANGE nastavíš rozsah např. 0 - 100 (bude to v procentech) a pak mu budeš posílat zprávu PBM_SETPOS, kde ve wparam bude procentuální hodnota načtené velikosti souboru.

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Ivo
~ Anonymní uživatel
93 příspěvků
2. 3. 2013   #3
-
0
-

Děkuji za radu, veče to vyzkouším.

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
3. 3. 2013   #4
-
0
-

tak nevím asi na to nemám buňky.. našel jsem o tom plno věcí ale nic jsem nepochopil :D tak holt progress stahování nebude :D veškerej výsledek byl že po mým lamským zakomponování kódu to buď nestahovalo, nebo to stahovalo ale padalo a nebo to prostě jen padalo :D nemám s mfc moc zkušeností, v C++ se nějakou dobu pohybuju ale zatím jsem dělal max tak dll (4megovou :D) ale tohle ovládání zobrazení a podobně.. to je pro Mně porod :D už jen donutit tu aplikaci sby určité věci dělala v odděleném threadu a tak se nesekala mi trvalo asi tejden :D

ale i tak děkuju za vstřícný přístup a vůbec ochotu mi na Můj dotaz odpovědět a navést Mně správným směrem.

Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
4. 3. 2013   #5
-
0
-

#4 Ivo
Tady máš fungující jednoduchou ukázku.
Pozor! Ten Sleep(100) v cyku čtení je tam aby při testování na nepříliš velkém souboru to jen neprobliklo a byl vidět průběh.

#include "stdafx.h"
#include "resource.h"

HANDLE _hthread_stahovani = NULL;
HWND _hwnd = NULL;

unsigned __stdcall thread_proc_stahovani(void* parametr) throw()
{
	wchar_t sz_url[1000];
	if (GetDlgItemText(_hwnd, IDC_URL, sz_url, sizeof(sz_url) / sizeof(wchar_t)) == 0)
		return -1;
	const int velikost_bloku = 250;
	HINTERNET hinternet = NULL;
	HINTERNET hurl = NULL;
	do
	{
		hinternet = InternetOpenW(L"stahovani_demo", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
		if (!hinternet)
			return -1;
		hurl = InternetOpenUrl(hinternet, sz_url, NULL, 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD, 0);
		if (!hurl)
			break;
		wchar_t sz_velikost[50];
		DWORD dw_velikost = sizeof(sz_velikost);
		if (!HttpQueryInfoW(hurl, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dw_velikost, NULL))
			break;
		dw_velikost = (DWORD)_wtoi(sz_velikost);
		char sz_text[velikost_bloku + 1];
		DWORD dw_precteno = 0;
		bool b_ok = false;
		DWORD nacteno_celkem = 0;
		do 
		{
			b_ok = (InternetReadFile(hurl, sz_text, velikost_bloku, &dw_precteno) != 0);
			if (dw_precteno)
			{
				// Tady nějak zpracovávat přečtená data
				Sleep(100);
				nacteno_celkem += dw_precteno;
				SendDlgItemMessage(_hwnd, IDC_PRUBEH, PBM_SETPOS, (nacteno_celkem * 100) / dw_velikost, 0);
			}
		}
		while (b_ok && (dw_precteno != 0));
	}
	while (false);

	if (hurl)
		InternetCloseHandle(hurl);
	if (hinternet)
		InternetCloseHandle(hinternet);
	SetDlgItemText(_hwnd, IDC_URL, L"");
	return 0;
}

void on_stahnout() throw()
{
	unsigned int ui;
	_hthread_stahovani = (HANDLE)_beginthreadex(NULL, 0, thread_proc_stahovani, NULL, 0, &ui);
	if (!_hthread_stahovani)
		ExitProcess(GetLastError());
}

INT_PTR CALLBACK dialog_proc(HWND hwnd, UINT zprava, WPARAM wparam, LPARAM lparam) throw()
{
	switch (zprava)
	{
	case WM_INITDIALOG:
		_hwnd = hwnd;
		SendDlgItemMessage(hwnd, IDC_PRUBEH, PBM_SETRANGE32, 0, 100);
		SetDlgItemText(hwnd, IDC_URL, L"http://www.radekchalupa.cz/knihy/tipy-visualc/ukazkove_aplikace.zip");
		break;
	case WM_COMMAND:
		switch (LOWORD(wparam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hwnd, LOWORD(wparam));
			break;
		case IDC_STAHNOUT:
			on_stahnout();
			break;
		}
		break;
	}
	return 0;
}


int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_HLAVNI), NULL, dialog_proc);
	return (int)0;
}

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Ivo
~ Anonymní uživatel
93 příspěvků
4. 3. 2013   #6
-
0
-

děkuji za příklad, sice mi nefunguje (stahuje soubor ale neuklada ho a ani progress bar se neaktualizuje) ALE

díky struktuře Vašeho kódu jsem konečně pochopil jak to funguje, sice ne natolik abych byl schopný udělat progressbar, ale jednoduchý 

Staženo xxxKB/MB z xxxKB/MB

ano :)

ve funkci z prvního příspěvku jsem udělal úpravu:

if( nError == ERROR_SUCCESS )
{
  DWORD dwBytesRead = 0;
  DWORD dwTOTALSize = 0;
  BYTE buffer[2048];
 
  dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

  fprintf(fh, "%d\n",dwTOTALSize);
 
  while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
  {
   nacteno_celkem += dwBytesRead;
   if(nacteno_celkem>1048576)
    fprintf(fh, "%dMB\n",nacteno_celkem/1024/1024);
   else
    fprintf(fh, "%dKB\n",nacteno_celkem/1024);

   WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
  }
}

a ano, uklada mi to do txt souboru informace o to nejdriv kolik KB a potom MB bylo stazeno.. to je super.. ALE:. nejak mi porad nefunguje to zjisteni velikosti souboru na servru a nevim proc :(

dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

mi porad vraci nulu :/

hFile je

hFile = InternetOpenUrl(hInet,lpUrl,0,0,0,0);

de hlnet je hInet = InternetOpen(lpAppName,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);

a lpurl je LPCTSTR lpUrl (adresa co se pe do ty Download FIle funkce treba

DownloadFile("http://neco.neco/neco/neco.zip", "soubor.zip")

asi mam spatne tu syntaxi dwTOTALSize=HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, NULL, 0, 0);

ale nevim jak.. )

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
4. 3. 2013   #7
-
0
-

tak jsem pokusem

wchar_t sz_velikost[50];

DWORD dwTOTALSize = sizeof(sz_velikost);
HttpQueryInfoW(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);


fprintf(fh, "%d\n",sz_velikost);

dokazal z toho vydolovat nějakou value.. ale je špatně.. soubor má velikost něco přez 44MB 

a sz_velikost mi vrací 36632248 což je blbost :/

dwTOTALsize mi vraci bud 0 nebo 16.. coz je taky nejaky nepravdepodobny :D

nehlede na to ze sz_velikost mi vraci napadne podobna cisla i kdyz chci stahnout soubor ktery ma treba jen jeden kilobajt.. tak mi vrati treba 35520056

tak nevim co je spatne :(

Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
5. 3. 2013   #8
-
0
-

#7 Ivo
HttpQueryInfo vrací velikost jako text (do zadaného bufferu), takže musíš použít např. _wtoi/atoi pro převod na číslo. Ten tvůj printf (s parametrem d) ti vypíše adresu proměnné sz_velikost, což samozřejmě nemá s obsahem nic společného.

Jinak v tom mém příkladě zápis není, to máš vyřešené a šlo ti o to jak průběžně zobrazovat průběh stahování. Psal jsem to narychlo, takže tam nejsou všechny kontroly a především tam chybí CloseHandle na ten thread - ten handle není potřeba tak ho můžeš zavřít hned po _beginthreadex.

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 3. 2013   #9
-
0
-

Ahoj


int temp = atoi((LPCTSTR)sz_velikost);

fprintf(fh, "sz_velikost: %d\n", temp);

teď už mi to vrací správnou velikost :)

děkuji :)

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 3. 2013   #10
-
0
-

sz_velikost: 42MB

nacteno_celkem/1024: 2KB

nacteno_celkem/1024: 4KB

nacteno_celkem/1024: 6KB
nacteno_celkem/1024: 8KB
nacteno_celkem/1024: 10KB
nacteno_celkem/1024: 12KB
nacteno_celkem/1024: 14KB
nacteno_celkem/1024: 16KB
nacteno_celkem/1024: 18KB
nacteno_celkem/1024: 20KB
nacteno_celkem/1024: 22KB
nacteno_celkem/1024: 24KB
nacteno_celkem/1024: 26KB
nacteno_celkem/1024: 28KB
nacteno_celkem/1024: 30KB
nacteno_celkem/1024: 32KB
nacteno_celkem/1024: 34KB
nacteno_celkem/1024: 36KB
nacteno_celkem/1024: 38KB
nacteno_celkem/1024: 40KB
nacteno_celkem/1024: 42KB
nacteno_celkem/1024: 44KB
nacteno_celkem/1024: 46KB
nacteno_celkem/1024: 48KB
nacteno_celkem/1024: 50KB

díky díky díky :)

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 3. 2013   #11
-
0
-

finální log

sz_velikost: 42MB
Staženo 2KB z 43298KB
Staženo 4KB z 43298KB
Staženo 6KB z 43298KB
Staženo 8KB z 43298KB
Staženo 10KB z 43298KB
Staženo 12KB z 43298KB
Staženo 14KB z 43298KB
Staženo 16KB z 43298KB
Staženo 18KB z 43298KB
Staženo 20KB z 43298KB
Staženo 22KB z 43298KB
Staženo 24KB z 43298KB
Staženo 26KB z 43298KB
Staženo 28KB z 43298KB
Staženo 30KB z 43298KB
Staženo 32KB z 43298KB
Staženo 34KB z 43298KB
Staženo 36KB z 43298KB
Staženo 38KB z 43298KB
Staženo 40KB z 43298KB
Staženo 42KB z 43298KB
Staženo 44KB z 43298KB

a s tím už se dá pracovat :)

teď vymyslet jak posílat tu informaci někam dál a bude to ok :))

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
5. 3. 2013   #12
-
0
-

tadááá

BOOL CRommiesAvP2LoaderDlg::DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{  
	//FILE *fh=fopen("TESTSTAHOVANI.txt","w");

	//DWORD dwStart = GetTickCount();

	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;

	DWORD nacteno_celkem = 0;
	wchar_t sz_velikost[50];
	DWORD dwTOTALSize = sizeof(sz_velikost);
	char szZprava[256];
	CWnd *const pWndCheck = AfxGetMainWnd()->GetDlgItem(IDC_STATICxxx);
	pWndCheck->EnableWindow(TRUE);

	if( nError  == ERROR_SUCCESS )
	{
		hInet = InternetOpen(lpAppName,/*INTERNET_OPEN_TYPE_PRECONFIG*/INTERNET_OPEN_TYPE_DIRECT,0,0,0);
			if( hInet == INVALID_HANDLE_VALUE )
				nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,/*0*/INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
    }
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}

	HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);

	int temp = atoi((LPCTSTR)sz_velikost);
	
	//fprintf(fh, "sz_velikost: %dMB\n", temp/1024/1024);

	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];
		
		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
		{
			nacteno_celkem += dwBytesRead;
			if(nacteno_celkem>1048576)
			{
				//fprintf(fh, "Staženo  %dMB z %dMB\n",nacteno_celkem/1024/1024, temp/1024/1024);
				sprintf(szZprava, "Staženo  %dMB z %dMB\n",nacteno_celkem/1024/1024, temp/1024/1024);
			}
			else
			{
				//fprintf(fh, "Staženo %dKB z %dKB\n",nacteno_celkem/1024, temp/1024);
				sprintf(szZprava, "Staženo  %dKB z %dMB\n",nacteno_celkem/1024, temp/1024/1024);
			}

			AfxGetMainWnd()->SetDlgItemText(IDC_STATICxxx, szZprava);

			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
		}
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

	DWORD dwEnd = GetTickCount();

	//DWORD time = dwEnd - dwStart;
	//fprintf(fh, "Funkce trvala : %d sekund\n",time/1000);

	sprintf(szZprava, "Status Stahování");
	AfxGetMainWnd()->SetDlgItemText(IDC_STATICxxx, szZprava);

	pWndCheck->EnableWindow(FALSE);

	//fclose(fh);

return (BOOL) nError == ERROR_SUCCESS;
}

stahuje to a v hlavním okně programu to ukazuje kolik KB/KB z kolika KB/MB je staženo :)

mám jen jednu věc.. tu zprávu sprintf(szZprava, "Staženo  %dKB z %dMB\n",nacteno_celkem/1024, temp/1024/1024); posílám do Static Textu IDC_STATICxxx a při těch aktualizacích to "problikává" jen ten static text.. nejde tomu nějak zabránit? není to nic co by mi nějak extrémně vadilo.. jen tak pro pocit :D

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
6. 3. 2013   #13
-
0
-

tak jsem to vyresil, snad dost elegantne (vytizeni procesoru pri stahovani kleslo z 18% na 3.

na zacatku DownloadFile

DWORD start = timeGetTime();

a tam kde se stahuje:

if( nError == ERROR_SUCCESS )
{
  DWORD dwBytesRead = 0;
  BYTE buffer[2048];
 
  while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
  {
   nacteno_celkem += dwBytesRead;
   if(msg)
   {
    zzz=nacteno_celkem*100/temp;
    if(timeGetTime()-start > 100)
    {
     sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB (%d%%)",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024, zzz);
     AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
   
     if(zzz<100)
      AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);

     start = timeGetTime();
    }
   }
   WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
  }
}

Nahlásit jako SPAM
IP: 78.45.50.–
Ivo
~ Anonymní uživatel
93 příspěvků
6. 3. 2013   #14
-
0
-

akorat mam teda problem s Progress Barem..

zzz=nacteno_celkem*100/temp;

AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);

sice fungje, ale treba..

stahuju 18 MB soubor a je to v pohode.. na konci stahovani je ten progressbar na konci linky..

ale kdyz stahuju druhej soubor co ma 42MB, tak to stahuje, a i v logu kdyz ho udelam vidim 1, 2, 3 jako procenta.. a na 96 to najednou zase skoci na 0 i kdyz to dal stahuje.. takze na konci stahovani mam ProgressBar na hodnote 3 nebo 4 (proste jede a tesne pred koncem skoci zase na zacatek) i kyz je soubor spravne stazenej a neposkozenej....

nechapu :/

Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
6. 3. 2013   #15
-
0
-

#14 Ivo
Možná ti ta hodnota "zzz" přeleze nastavenou horní mez a pak se to "resetuje" jakoby od začátku...
Dej si tam podmínku něco jako if (zzz > horni_mez) zzz = horni_mez;

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Ivo
~ Anonymní uživatel
93 příspěvků
6. 3. 2013   #16
-
0
-

to nepomohlo.. stejne to zase ten progress bar posila od nuly :/

je to divny.. zacne to stahovat a jede to 

1%

2%

3%

...

...

95%

96%

0%

1%

2%

3%

BOOL DownloadFile(LPCTSTR lpUrl, LPCTSTR lpFileName, LPCTSTR lpAppName = TEXT("Loader"))
{
	DWORD start = timeGetTime();
	sprintf(DebugMsg, "::DownloadFile()->Start()");
	RommieDebug(DebugMsg);
	HINTERNET hInet = INVALID_HANDLE_VALUE;
	HINTERNET hFile   =  INVALID_HANDLE_VALUE;
	HANDLE  hLocalFile = INVALID_HANDLE_VALUE;
	BOOL WINAPI CleanupCredentialCache(void);
	int nError = ERROR_SUCCESS;
	DWORD nacteno_celkem = 0;
	wchar_t sz_velikost[50];
	DWORD dwTOTALSize = sizeof(sz_velikost);
	char szZprava[256];
	bool msg=false;
	int zzz=0;
	int horni_mez=100;
//	CWnd *const pWndCheck = AfxGetMainWnd()->GetDlgItem(/*IDC_STATICxxx*/IDC_EDIT4);

	AfxGetMainWnd()->SendDlgItemMessage((int)AfxGetMainWnd()->GetDlgItem(IDC_PROGRESS1), PBM_SETRANGE, MAKELPARAM(0, 100));
	AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 0, 0);
	
	if( nError  == ERROR_SUCCESS )
	{
		hInet = InternetOpen(lpAppName,/*INTERNET_OPEN_TYPE_PRECONFIG*/INTERNET_OPEN_TYPE_DIRECT,0,0,0);
		if( hInet == INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}
	if( nError == ERROR_SUCCESS )
	{
		hFile = InternetOpenUrl(hInet,lpUrl,0,0,/*0*/INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_RELOAD,0);
		if(hFile == INVALID_HANDLE_VALUE)
			nError = GetLastError();
   	}
	if( nError == ERROR_SUCCESS )
	{
		hLocalFile = CreateFile(lpFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
		if( hLocalFile== INVALID_HANDLE_VALUE )
			nError = GetLastError();
	}

	HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, sz_velikost, &dwTOTALSize, NULL);

	int temp = atoi((LPCTSTR)sz_velikost);

	if(temp>153600)
	{
		msg=true;
	}

	if( nError == ERROR_SUCCESS )
	{
		DWORD dwBytesRead = 0;
		BYTE buffer[2048];
		
		while( InternetReadFile(hFile,buffer, sizeof(buffer), &dwBytesRead)==true && dwBytesRead != 0 )
		{
			nacteno_celkem += dwBytesRead;
			if(msg)
			{
				zzz=nacteno_celkem*100/temp;
				if(timeGetTime()-start > 250)
				{
					sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024);
					AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
				
					if(zzz>horni_mez)
						zzz = horni_mez;
						
					AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, zzz, 0);
	
					sprintf(DebugMsg, "Stahovani \"%s\" -> %d%%", lpFileName, zzz);
					RommieDebug(DebugMsg);

					start = timeGetTime();
				}
			}
			WriteFile(hLocalFile, buffer, dwBytesRead, &dwBytesRead, 0);
		}
	}
	if( hLocalFile )
		CloseHandle(hLocalFile);

	if( hFile != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hFile);

	if( hInet != INVALID_HANDLE_VALUE )
		InternetCloseHandle(hInet);

	sprintf(DebugMsg, "::DownloadFile()->Hotovo(Status:%d - stazeno %dB)",nError, nacteno_celkem);
	RommieDebug(DebugMsg);
	
	if(temp>153600)
	{
		sprintf(szZprava, "Staženo\r\n%dB z %dB\r\n%dMB z %dMB",nacteno_celkem, temp, nacteno_celkem/1024/1024, temp/1024/1024);
		AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
		AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 100, 0);
	}
	else
	{
		sprintf(szZprava, "Staženo\r\n-B z -B\r\n-MB z -MB");
		AfxGetMainWnd()->SetDlgItemText(/*IDC_STATICxxx*/IDC_EDIT4, szZprava);
		AfxGetMainWnd()->SendDlgItemMessage(IDC_PROGRESS1, PBM_SETPOS, 100, 0);
	}

return (BOOL) nError == ERROR_SUCCESS;
}
Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
7. 3. 2013   #17
-
0
-

#16 Ivo
Zpráva PBM_SETRANGE má ty hodnoty v lparam (a wparam musí být nula), ty to dáváš do wparam a možná proto se chová "divně"...

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 3. 2013   #18
-
0
-

Nebo se nám do 32 bitů nevejde víc než 4G, že...

Nahlásit jako SPAM
IP: 78.156.159.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 3. 2013   #19
-
0
-

zzz=nacteno_celkem*100/temp;

Nahlásit jako SPAM
IP: 78.156.159.–
Ivo
~ Anonymní uživatel
93 příspěvků
7. 3. 2013   #20
-
0
-

4G je jako co?

Nahlásit jako SPAM
IP: 78.45.50.–
7. 3. 2013   #21
-
0
-

tak jinak: jaké největší číslo lze vyjádřit ve 32 bitech? zkus to unsigned.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Ivo
~ Anonymní uživatel
93 příspěvků
7. 3. 2013   #22
-
0
-

Zkusil jsem unsigned int a bohuzel.. porad to dela totez :/

Nahlásit jako SPAM
IP: 78.45.50.–
Radek Chalupa
~ Redaktor
+1
Super člen
8. 3. 2013   #23
-
0
-

#22 Ivo
unsigned moc nepomůže, je to stejné 32-bitové pouze je jinak interpretované a max. hodnota do plusu je pouze 2x větší.

Použij __int64 a/nebo ty hodnoty nacteno_celkem a temp nejdřív vyděl 1000/1024 (budeš to mít v kB což u velkých souborů pro výpočet procent až tak nevadí).

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Ivo
~ Anonymní uživatel
93 příspěvků
8. 3. 2013   #24
-
0
-

tak panove ani jedno nepomohlo :D :D

int64, vydeleni 1024, unsigned int.. :D porad ten progressbar ukazuje blbe :D :D

ale je zajimave ze u souboru 18MB to ukazuje spravne.. ale u 42MB ne.. je to nejaky sahly :)) nejaky dalsi napady? :)

Nahlásit jako SPAM
IP: 78.45.50.–
8. 3. 2013   #25
-
0
-

tím "zkus to unsigned" jsem myslel, jak velké unsigned číslo se vejde do 32 bitů.

jestli načteno celkem a temp jsou int, tak zzz=nacteno_celkem*100/temp; bude taky int. Tím násobením 100 to přetečení přiblížíš. Jestli je nacteno_celkem int a vynásobíš 100, výsledek se do int nevejde už při těch 42MB. Alespoň jeden z operandů by měl být __int64 (nejspíš oba aby mohly vyjadřovat velikosti souboru nad 4GB), pak i výsledek bude __int64.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Ivo
~ Anonymní uživatel
93 příspěvků
8. 3. 2013   #26
-
0
-

i kdyz je temp a zzz __int64 tak je to porad to same.. :( tak nevim no :/

Nahlásit jako SPAM
IP: 78.45.50.–
8. 3. 2013   #27
-
0
-

DWORD nacteno_celkem = 0; jak velká hodnota se tam vejde?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Ivo
~ Anonymní uživatel
93 příspěvků
8. 3. 2013   #28
-
0
-

Dikec :) nacteno_celkem je ted DWORD64 a uz se progress bar ukazuje spravne :))

dekuju :)

Nahlásit jako SPAM
IP: 78.45.50.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 179 hostů

Podobná vlákna

FTP - progress — založil Tomik

Progress bar — založil lot

Progress bar (OpenGL) — založil gaben

Jak otočit progress bar — založil Hula

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý