zdravím,
mám ještě otázku jaká funkce slouží pro stahování souborů z HTTP serveru? v System::IO sem nic bohužel nenašel... Dále jak to propojit s GUI prvkem Progress Bar, kterej mi vygenerovalo Visual Studio? Je třeba otevírat nové vlákno?
Díky
zdravím,
mám ještě otázku jaká funkce slouží pro stahování souborů z HTTP serveru? v System::IO sem nic bohužel nenašel... Dále jak to propojit s GUI prvkem Progress Bar, kterej mi vygenerovalo Visual Studio? Je třeba otevírat nové vlákno?
Díky
vzhledem k tomu že používáš .NET, tak zde http://msdn.microsoft.com/cs-cz/library/ez801hhe.aspx#Y840
ty tady nepouzivas cisty c++, ale c++/CLI, ktery používá (umožňuje) práci s .NET, takže pokud by jsi tuhle app pustil nekde, kde neni .NET, tak to nepůjde
v minulém příspěvku jsem odpovídal na čistý c++ :)
nevim co te na tom tak sere, .NET jde nainstalovat, je to otazka par MB (zde uz je lepsi C# nez c++/cli) a hlavně každej windows ho už obsahuje a pokud pouzijes specialni libku, tak posles spolecne s .exe (pripadne staticky, ale to moc nedoporucuju pokud je libka velka)
Jinak zkouším to udelat podle http://msdn.microsoft.com/en-us/library/system.net.webclient.downloadprogresschanged.aspx#Y906 a stejně se mi nedaří:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
String^ sappdata = getAppData();
String^ patcherDir = sappdata + "\\.tcpatcher";
if(!existDir(patcherDir)) createDir(patcherDir);
String^ remoteUri = "http://localhost/";
String^ fileName = "data.zip";
String^ myStringWebResource;
WebClient^ myWebClient = gcnew WebClient();
myStringWebResource = String::Concat(remoteUri, fileName);
myWebClient->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler( DPC );
myWebClient->DownloadFile(myStringWebResource, fileName);
}
static void DPC(Object^ sender, DownloadProgressChangedEventArgs^ e) {
int howmuch = 0;
howmuch = (int)e->ProgressPercentage;
}
A hází mi to chybu u myWebClient->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler( DPC ); "špatná syntax" ...
Nevíte proč?
Omlouvám se, středník.. :D
nicméně... Ten event je static ale progres bar je non-static... jak udelat aby ta statická metoda mohla pristupovat do naky non-static metody? konkretne aby mohla volat setBar(int cislo); diky
1) i windowsXP ma .NET (minimálně .NET 2.0)
2) nejde... non-static může volat static, ale obrácene ne
proč máš vůbec statickou funkci DPC ?
Ve chvíli kdy jí dám nonstatic tak to nadává
Error 1 error C3867: 'TechCraftPatcher::Form1::DPC': function call missing argument list; use '&TechCraftPatcher::Form1::DPC' to create a pointer to member c:\users\stodulka.jakub\documents\visual studio 2008\projects\techcraftpatcher\techcraftpatcher\Form1.h 158 TechCraftPatcher
Error 2 error C3350: 'System::Net::DownloadProgressChangedEventHandler' : a delegate constructor expects 2 argument(s) c:\users\stodulka.jakub\documents\visual studio 2008\projects\techcraftpatcher\techcraftpatcher\Form1.h 158 TechCraftPatcher
Na řádku s:
myWebClient->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler( DPC );
V případě žo to budu volat takto: (this, &Form1::DPC); tak není třeba aby byla metoda statická, takže to jde..
I tak to bohužel nefunguje jak má... :/
private: void DPC(Object^ sender, DownloadProgressChangedEventArgs^ e) {
int howmuch = 0;
int now = 0;
int full = 0;
howmuch = (int)e->ProgressPercentage;
now = (int)e->BytesReceived;
full = (int)e->TotalBytesToReceive;
setBar(howmuch,now,full);
}
private: void setBar(int p,int now, int full) {
this->progressBar->Value::set(p);
}
Soubor se stáhne ale v progressu se nic nezmění
nejspíš proto, že stahování souboru je blokový a app je bloke dokud se soubor nestáhne - ani neaktualizuje bar... ale to teď tipuju, protože teď nevim jestli se ta událost vykonává asynchroně.. pokud ne, tak je to tim že máš vše v jednom vláknu
v každým případě Form se blokne při stahování
Ano blokne, právě že se to nedělá asynchroně, ta možnost tam je, ale pak tam je zase plno věcí chaotickejch... Je možnost dát jen tu událost ten event do novýho vlákna? popř. jak a kde přesně to vlákno vytvářim? (Abych jich za jedno sosnutí nevytvořil třeba 200)
Vyřešeno...
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//pri kliknuti na mackatko
//Smazeme %AppData%/.tcpatcher/*
//Vytvorime slozku znovu
//sosnem archiv
//Rozbalime
//;)
String^ sappdata = getAppData();
String^ patcherDir = sappdata + "\\.tcpatcher";
if(!existDir(patcherDir)) createDir(patcherDir);
String^ remoteUri = "http://localhost/";
String^ fileName = "data.zip";
String^ myStringWebResource;
myStringWebResource = String::Concat(remoteUri, fileName);
Uri ^uri = gcnew Uri(myStringWebResource);
WebClient^ myWebClient = gcnew WebClient();
myStringWebResource = String::Concat(remoteUri, fileName);
myWebClient->DownloadProgressChanged += gcnew DownloadProgressChangedEventHandler(this, &Form1::DPC);
myWebClient->DownloadFileAsync(uri, fileName);
}
private: void DPC(Object^ sender, DownloadProgressChangedEventArgs^ e) {
int p = 0;
int now = 0;
int full = 0;
p = (int)e->ProgressPercentage;
now = (int)e->BytesReceived;
full = (int)e->TotalBytesToReceive;
this->progressBar->Value::set(p);
this->info->Text = "Stahuji "+(now/1024)+"Kb / "+(full/1024)+"Kb";
}
však můžeš použít async funkci - DownloadFileAsync .. více info přímo v doc. msdn a pokud tu funkci napíšeš do googlu tak opět plno výsledků / ukázek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku