Dateidownload
-
Moin Moin.
Ich schreibe gerade an einem Download-Programm. Es funktioniert mittlerweile ganz gut, nur habe ich 2 kleine Probleme:
a)
In einer while-Schleife werden immer 8192 Bytes von der Datei geladen und gespeichert. Während sich das Programm in dieser while-Schleife befindet, kann ich keinen einzigen Button anklicken. Ich würde aber gerne einen "Download abbrechen"-Button anbieten. Dafür muss ich ja sicher irgendwas in die while-Schleife einbauen, so dass die Buttons auf dem Form anklickbar sind, oder?b)
Ich habe ein 6Mbit-Leitung, aber wenn meine Berechnungen stimmen, komme ich nicht über 100KB/sec. Am Server liegt es nicht, denn der liefert die 6Mbit locker und auch meine Leitung müsste in Ordnung sein. Ich hab schon die Anzahl der eingelesenen Bytes schrittweise von 512 auf 1024...8192 erhöht, aber an der Geschwindigkeit scheint das nichts zu ändern? Hat zufällig jemand eine Idee, woran es liegen könnte?Danke für Tipps.
mfg
-
a) Threads...
-
b)
MSG message; if(::PeekMessage(&message,NULL,0,0,PM_REMOVE)) { ::TranslateMessage(&message); ::DispatchMessage(&message); }Die Nachrichtenschleife einfach selber mit implementieren an der Stelle.
-
@(D)Evil:
Ich hab noch nie mit Threads gearbeitet, hab mir aber einiges gebastelt:
UINT myProc( LPVOID pvParam ) { CDialogDlg* pDlg = (CDialogDlg*) pvParam; // HIER m_VariCopy = pDlg->m_Vari; // m_Vari ist aus dem Hauptdialog pDlg->MessageBox(m_VariCopy); [. . . .] return 0; } void CDialogDlg::OnBnClickedButton2() { AfxBeginThread(myProc,this,THREAD_PRIORITY_NORMAL,0,0,NULL); }Problem ist nun, dass m_Vari bzw. m_VariCopy nicht aktualisiert ist. Also brauche ich an der "HIER"-Stelle ein UpdateData().
Nehme ich
UpdateData(TRUE);kommt "error C3861: 'UpdateData': identifier not found, even with argument-dependent lookup"
Nehme ich
pDlg->UpdateData(TRUE);wird zwar kompiliert, aber drücke ich Button2, bekomme ich einen "Debug Assertion Failed!" in wincore.cpp
Was mache ich falsch? Wie muss ich UpdateData aufrufen?
Danke.
mfg
-
Ach, bin ich dämlich

Ich mache einfach ein UpdateData(TRUE); in OnBnClickedButton2()
*kopfaufdietischplattehau*
mfg
-
Mist. Ich brauche in
UINT myProc( LPVOID pvParam ) { [. . . .] }ein UpdateData(FALSE), um einen Fortschrittbalken zu aktualisieren. Also benötige ich doch noch einmal Hilfe.
mfg
-
Hmm... wenn de auf Variablen von Klassen aus Threads zugreifen willst, arbeitet man nahezu AUSSCHLIEßLICH mit Pointern

und UpdateData wird da so nicht gehen... m_VariCopy (wenn es wirklich eine Membervariable von CDialogDlg) ist auch nicht

-
Also dass das mit m_VariCopy definitiv funktioniert, kann ich garantieren.

Die Frage ist halt nur: wie bekomme ich UpdateData() ausgeführt??
mfg
-
Wieso holst du dir nicht einfach einen CWnd Pointer und rufst die entsprechenden Funktionen auf, so wie es sich gehört?
-
Dass ich nicht gerade ein Experte in C++ bin, hatte ich wohl vergessen zu sagen, oder?

(kleinlaut) Irgendwelche Codefragmente, die mir auf die Sprünge helfen könnten?
mfg
-
Was willst du denn machen? die Position deiner Progressbar nach vorne setzen?
CProgressCtrl* pProgressCtrl = (CProgressCtrl*)GetDlgItem(IDC_MYEDITCTRL); if (!pProgressCtrl) return 0; int nPos = pProgressCtrl->GetPos(); pProgressCtrl->SetPos(++nPos);So in etwa...
Referenzen:
CProgressCtrl Memberfunctions
-
Auch. Aber ich habe aber gemerkt, dass die Aktualisierung unabhängig von UpdateData() gemacht wird.
Ich habe allerdings noch einen Text, der mehrmals aktualisiert werden muss. Und dafür brauche ich UpdateData().
mfg
-
Man braucht UpdateData eigentlich NIE!. Ruf einfach mehrmals SetWindowText auf... fertig -.-
-
Ja, super! Vielen, vielen Dank!

Jetzt muss ich nur noch herausfinden, wieso der Download so langsam ist.
mfg
-
Falls es jemanden interessiert: es lag wirklich an dem zu kleinen Lese-Puffer.
Ob 512...8192 hat nichts ausgemacht, aber nachdem ich den Puffer auf 81920 setzte, hatte ich meine 600kb/s

Also statt
[...] char strbuf[512]; [...] while(bytesread=fTargetFile->Read(strbuf,512)) { [...] } [...]einfach
[...] char strbuf[81920]; [...] while(bytesread=fTargetFile->Read(strbuf,81920)) { [...] } [...]Quelle: http://www.codeproject.com/Purgatory/Download_file_from_net.asp
-> Download_file_from_net_demo - Download files from internetDanke noch einmal an (D)Evil
mfg