Thread in Dialogfeld



  • Hallo

    Ich habe einen CWinThread zum Uploaden von Dateien per FTP in einer dialogfeldbasierten Anwendung laufen.

    CWinThread* m_pThread;
    
    m_pThread = AfxBeginThread(UploadThread,(LPVOID)&m_arFiles);
    
    UINT CUploadDlg::UploadThread(LPVOID pParam)
    

    Das funktioniert so weit auch alles, nur ein kleines Problem hab ich noch.
    Ich müsste in den Thread hinein Variablenwerte übergeben, wie kann ich das realisieren, im Moment mach ich es mittels Dateizugriff, aber diese Lösung ist wohl nicht die beste...

    Und noch wichtiger, ich müsste vom Dialogfeld aus an die Werte der Zähler die im Thread laufen kommen um eine Fortschrittsanzeige anzeigen zu können.

    Kann mir da jemand weiterhelfen bitte ?

    Vielen Dank 🙂



  • Ich würde dem Thread den this-Zeiger des Dialogs übergeben.

    m_pThread = AfxBeginThread(UploadThread,(LPVOID)this);
    
    UINT CUploadDlg::UploadThread(LPVOID pParam)
    {
       CUploadDialog* pThis = reinterpret_cast<CUploadDialog*>(pParam);
    
       // Zugriff auf Variablen der Klasse CUploadDialog jetzt möglich!
       pThis->m_variable = 100;
    }
    

    Damit der Thread mit der Dialogklasse kommunizieren kann, muss dieser
    dem Dialog Nachrichten senden, da ein Zugriff auf die GUI-Elemente vom
    Thread heraus nicht möglich ist, da die MFC den Threadspeicher prüft
    und dieser eben aus dem Thread heraus nicht valide ist(ASSERT_VALID()).

    Lösung:

    // CUploadDialog.cpp
    
    #define WM_UPLOADDIALOG_ON_PROGRESS (WM_APP + 0x01)
    
    BEGIM_MESSAGE_MAP()
       ON_MESSAGE(WM_UPLOADDIALOG_ON_PROGRESS, OnUpdateProgress)
    END_MESSAGE_MAP()
    
    UINT CUploadDlg::UploadThread(LPVOID pParam)
    {
       CUploadDialog* pThis = reinterpret_cast<CUploadDialog*>(pParam);
    
       for (int percent = 1; percent < 100; ++percent)
       {
          ::SendMessage(pThis->GetSafeHwnd(), WM_UPLOADDIALOG_ON_PROGRESS, (WPARAM)percent, 0);
          ::Sleep(100);
       }
    }
    
    LRESULT CUploadDialog::OnUpdateProgress(WPARAM wParam, LPARAM lParam)
    {
       int percent = reinterpret_cast<int>(wParam);
    
       // Aktualisiere Progressbar
    
       return 0;
    }
    

    und natürlich im Header:

    class CUploadDialog
    {
       public:
          afx_msg LRESULT OnUpdateProgress(WPARAM wParam, LPARAM lParam);
    }
    


  • Danke schaut sehr gut aus, nur ein kleines Problem gibts da noch und zwar:

    error C2440: 'reinterpret_cast': 'WPARAM' kann nicht in 'int' konvertiert werden
    

    Weiß da jemand Abhilfe ?

    Danke 🙂



  • Okay, die Zeile ändern in

    int percent = static_cast<int>(wParam);
    

    WPARAM ist ein typedef auf UINT_PTR. Das wiederum ist ein typedef auf
    unsigned int. Deswegen kann es mit static_cast zurückgecastet werden.

    Gehen würde auch folgendes

    int percent = (int)wParam;
    


  • Super, danke. 🙂


Anmelden zum Antworten