Größe einer Datei aus dem I-Net ???
-
Ich weiss. Afaik geht das aber nicht von einem anderen Thread aus. Ach, ich teste es einfach mal schnell aus
-
Original erstellt von dEUs:
pYourDlg->UpdateData(false);
Funktioniert das? iirc dürfte es nicht funktionieren ...Funktionieren tut das schon - bloß da is immer so ein dummer ASSERT...
-
LOOL
ASSERT((CWnd*)p == this); // must be us // Note: if either of the above asserts fire and you are // writing a multithreaded application, it is likely that // you have passed a C++ object from one thread to another // and have used that object in a way that was not intended. // (only simple inline wrapper functions should be used) // // In general, CWnd objects should be passed by HWND from // one thread to another. The receiving thread can wrap // the HWND with a CWnd object by using CWnd::FromHandle. // // It is dangerous to pass C++ objects from one thread to // another, unless the objects are designed to be used in // such a manner.
Deswegen würd ich das nciht so machen, sondern per SetWindowText. Wenn du das editierst, dann kannst du auch gleich noch die Fehler im Code rauseditieren:
Einmal nFileSizeBytes statt nFileSize. Die Funktion heisst DownloadFile, in OnDownload wird der Thread aber mit SearchUpdate gestartet. Und das i des letzten ifs der Threadfunktion hat einen Akkzent statt einem Punkt: í statt i
-
Dann sei mal so gut und poste den Alternativ-Code. Ich bleib bei meinem Code. Irgdnwas war da doch, wesegen
GetDlgItem(IDC_IRGENDWAS)->SetWindowText("hallo");
nicht funzte...
Happosai
-
UINT DownloadFile(LPVOID pParam) { char cReadBuffer[512]; //Lese-Buffer //YourDlg = der Dialog, in dem die Funktion aufgerufen wurde bzw. in dem //die Informationen angezeigt werden sollen CMFCTestDlg* pYourDlg = (CMFCTestDlg*)pParam; CInternetSession pInetSession; //Internet-Sitzung CStdioFile* pNetFile; //liest später die Datei vom HTTP-Server CString strFileName = "http://www.volkard.de/vcppkold/vcppk.zip"; //Internet-Dateiname CString strLocalFileName = "C:\\vcppk.zip"; //Dateiname auf'm PC CString strPercent = "0 % (0 / 0 Bytes)"; //zeigt später in einem Static (Member-Variable m_Percent; //Typ: CString) den Fortschritt an int nFileSize = 0; //Dateigröße in Bytes try //wir VERSUCHEN die Datei zu öffnen { //m_Status = Static-Feld, Member-Variable vom Typ CString pYourDlg->m_Status = "Vorgang initialisiert. Suche wird gestartet ..."; pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); //Datei öffnen pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); pYourDlg->m_Status = "Anfrage gesendet. Warte auf Antwort ..."; pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); nDownloadOK = 1; //Download erfolgreich (zumindestens bis hier hin...) //Dateigröße ermitteln nFileSize = pNetFile->SeekToEnd(); pNetFile->SeekToBegin(); //CFile-Instanz zum Schreiben der Datei CFile pLocalFile(strLocalFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); //Variablen für's Lesen und für den Fortschritt int nBytesToWrite = 0; int nPosProgressBar = 0; int nPercent = 0; //Datei gefudnen, und genau das sagen wir dem User... pYourDlg->m_Status = "Datei gefunden. Download beginnt ..."; pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); //m_Progress = ProgressBar, Member-Variable vom Typ CProgressCtrl //Einstellen des Wertebereiches pYourDlg->m_Progress.SetRange32(0, 100); //das eigentliche Lesen und Schreiben der Dateien while(nBytesToWrite = pNetFile->Read(cReadBuffer, 512)) { pYourDlg->m_Status = "Datei gefunden. Download läuft ..."; pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); //checken, ob User abbrechen will if(nTerminate == 1) { pLocalFile.Close(); pNetFile->Close(); delete pNetFile; pYourDlg->m_Status = "Vorgang abgebrochen!"; pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); AfxEndThread(0); } //die obige if-Anweisung beliebig oft einfügen, je öfter, desto öfter wird ge- //prüft, ob der User abbrechen will nPosProgressBar += nBytesToWrite; pLocalFile.Write(cReadBuffer, nBytesToWrite); //prozentualen Anteil der Operation berechnen nPercent = nPosProgressBar * 100 / nFileSize; pYourDlg->m_Progress.SetPos(nPercent); //Fortschritt in Wort-Form anzeigen strPercent.Format("%i %% (%i / %i Bytes)", nPercent, nPosProgressBar, nFileSize); pYourDlg->m_Percent = strPercent; pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent); } //Lesen beendet ! pLocalFile.Close(); } catch(CInternetException *IE) //mgl. Fehler abfangen { CString strError; TCHAR cError[255]; IE->GetErrorMessage(cError, 255); strError = cError; pYourDlg->m_Status = strError; //Fehler anzeigen im Static nDownloadOK = 0; } pYourDlg->m_Percent = "0 % (0 / 0 Bytes)"; pYourDlg->m_Progress.SetPos(0); pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent); if(nDownloadOK == 1) //Download erfolgreich abgeschlossen!!!! { pYourDlg->m_Status = "Download abgeschlossen."; pYourDlg->m_Percent = strPercent; pYourDlg->m_Progress.SetPos(100); pYourDlg->SetDlgItemText(IDC_STATIC_STATUS,pYourDlg->m_Status); pYourDlg->SetDlgItemText(IDC_STATIC_PERCENT,pYourDlg->m_Percent); } nClick = 0; //Button wieder in Anfangszustand versetzen lassen //IDC_DOWNLOAD ist der Button, mit dem der Thread gestartet wurde. //Er war während des Downloads auf "Abbrechen" gestellt (siehe Code unten) pYourDlg->SetDlgItemText(IDC_DOWNLOAD, "Download starten"); if(nDownloadOK == 1) { //Auswertung des erfolgreichen Downloads } else { //Auswertung des fehlgeschlagenen Downloads } return 1; //Thread beendet }
[ Dieser Beitrag wurde am 14.11.2002 um 23:28 Uhr von dEUs editiert. ]
-
Hi dEUs, du hast oben bei der Initialisierung von strPercent die ) am Ende vegessen
Happosai
-
*g* Das hast du vergessen, das hat schon in deinem Source gefehlt
Du bist schuld! :p
Sind jetzt alle mit dem Source zufrieden? Falls ja, würde ich nen neuen Beitrag aufmachen, ohne unsere Diskussion, den Code reinkopieren und sagen, dass er von dir kommt, ok?[ Dieser Beitrag wurde am 14.11.2002 um 23:29 Uhr von dEUs editiert. ]
-
Naja - viel zu umfangreich um nur eine Datei zu downloaden...
-
Für mich schaut das aus wie eine Kopie von
http://www.codeguru.com/internet/dllfileprog.htmlAber eigentlich könnte es mir ja egal sein
MfG veganza
-
Da muss ich veganza recht geben!
Hier und da ein paar Zeilen modifiziert, vor ein paar Variable ein 'n' und Status-Texte ins Deutsche geändert... Zufall? Wohl eher nicht...Aber vlt ist ja Happosai == Aviad Tobaly....
Wenn nicht dann:[ Dieser Beitrag wurde am 15.11.2002 um 11:39 Uhr von Nemesyzz editiert. ]
-
Sourcecode ist Sourcecode.
Und ich finde es sollte in die FAQ, egal von wem es ist. (falls es da noch nich ist...)devil
-
@devil81
Sourcecode ist Sourcecode.
Sicher richtig... aber man klaut ihn nicht
@Nemesyzz
Thx 4 your supportMfG veganza
P.S. Jetzt ist aber wieder aus mit streiten
-
Er hat nie behauptet das er den ganzen source selbstgeschrieben habe...
devil
-
So jetzt ich nochmal ...
@veganza <- wusste garnicht das man bei Codguru was klauen kann !!Die sachen werden da doch frei zur verfügung gestellt.!! Also wo ist das Prob..
Und wie oft liest man hier im Forum "Schau bei CodeGuru nach"Und wie ist das wenn dieser Beitrag ins Forum wandert. Dann klauen wir auch alle von dort ??? Sehr merkwürdig....
Anstatt über andere herzuziehen mal drüber nachdenken wozu das forum hier da ist...
Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür)
im gegensatzt zu dir mit diesen Sinlosen Beitrag !!So und jetzt ab ins Forum damit @deus
AndOne
-
@AndOne
So kann ich das natürlich nicht stehen lassen:Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür)
im gegensatzt zu dir mit diesen Sinlosen Beitrag !!Um zu HELFEN .... und HAPPOSAI hat mir geholfen (Vielen Dank nochmal dafür) im Gegensatz zu Dir mit diesem sinnlosen Beitrag !!
Und nochmal Danke für Deine sinnlose Erklärung, daß mein Beitrag sinnlos war !!!
MfG veganza
-
Noch etwas hoffentlich sinnvolles ( traue mich ja schon gar nicht mehr zu posten ) :
Ich würde um
//Datei öffnen pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
diesen Code noch ein try -> catch schreiben !!!
In etwa so :
try { pNetFile = pInetSession.OpenURL(strFileName, 1, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD); } catch(CInternetException *IE) //mgl. Fehler abfangen { CString strError; TCHAR cError[255]; IE->GetErrorMessage(cError, 255); strError = cError; pYourDlg->m_Status = strError; //Fehler anzeigen im Static nDownloadOK = 0; }
damit nicht existente URL's nicht in einer Exception enden
MfG veganza
-
Das öffnen ist doch eigentlich schon in einem try-Block, oder meinst du was anderes?
Zu codeguru.com:
Ich weiß nicht, wieso, aber die Sources auf codeguru.com sind immer unter aller Sau geschrieben. Leerzeilen gibt's da net, Anweisungen stehen hintereinander, ungarische Notation ist oftmals ein Fremdwort.Allein das Ordner der Codezeilen ist schon eine Arbeit gewesen.
Der Code stand kostenlos bereit, ich hab ihn in mein Prog eingebaut und in einigen Dingen verändert. Wer damit ein Porblem hat, darf ja gern weiterhin den Originalcode von Aviad Tobaly nehmen. Soll mir egal sein.
Und auch auf codeguru.com oder codeproject.com gibt's viel doppeltes!
Muss ich mich noch weiter rechtfertigen?Happosai
PS: Ich bin mit dem Code vollauf zufrieden, kann meinetwegen gern in die FAQ als Einzelthread verschoben werden.
[ Dieser Beitrag wurde am 15.11.2002 um 16:38 Uhr von Happosai editiert. ]
-
@Happosai
Rechtfertigen mußt DU dich nicht...
Das öffnen ist doch eigentlich schon in einem try-Block, oder meinst du was anderes?
Setzte mal anstelle von
CString strFileName = "http://www.volkard.de/vcppkold/vcppk.zip"; CString strFileName = "http://www.dieurlgibtesnicht.de/data/datei.zip";
Führe das dann aus... und Du wirst eine Exception bekommen !!!
Und auch auf codeguru.com oder codeproject.com gibt's viel doppeltes!
Das ist deswegen doppelt weil der Autor das auf diesen beiden Seiten veröffentlicht ( ist doch immer die gleiche Person )...
-
veganza:
Das kann ich nicht bestätigen. Bei mir springt er da ganz brav in den catch-Block und schreibt ins Statusfenster, dass es diese Adresse net gibt.
-
Mit "doppelt" meinte ich, dass er mehrere, verschiedene Lösungen für ein Problem gibt. Von verschiedenen Autoren.
So viel Möglichkeiten kann's aber nicht geben, eine Datei aus dem Netz zu laden. Irgendwann ist schluss und man muss sich einfach den besten Code raussuchen. Auch wenn alle das selbe machen, der, der besser gegliedert oder kommentiert ist, wird genommen.Happosai