Dateidownload
-
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