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 internet

    Danke noch einmal an (D)Evil

    mfg


Anmelden zum Antworten