von Thread auf Variablen zugreifen?!?



  • Das Beispiel ist auf das Wichtigste beschränkt.
    Keine MessageMap und Co.
    Ich greife vom Thread nur indirekt auf Methoden zu.
    Der Thread dient eigentlich nur dazu eine andere Methode meiner Klasse aufzurufen!

    //NThreadDlg.h
    class CNThreadDlg : public CDialog {
    protected:
      // unser Datenlieferant für den Thread
      struct tdata {
        CNThreadDlg * pDlg;
        size_t Range;
    
        tdata(CNThreadDlg * dlg, size_t range = 100) :
         pDlg(dlg)
         , Range(range)
        {}
      };
    
      bool m_bRun;
      CWinThread* m_pThread;
    
      void run(size_t range);
      void start();
      void stop();
    
      static UINT RUNNER(LPVOID);
    };
    
    //NThreadDlg.cpp
    CNThreadDlg::CNThreadDlg(CWnd* pParent /*=NULL*/)
     : CDialog(CNThreadDlg::IDD, pParent)
     , m_bRun(false)
     , m_pThread(0) 
    {}
    
    UINT CNThreadDlg::run(size_t range) {
      m_ctrlProgressBar.SetRange32(0, range);
      while(m_bRun ) {
        m_ctrlProgressBar.StepIt();
        _sleep(500); // sonst sieht man nur Geflacker! 
      }
    }
    
    void CNThreadDlg::start() {
      m_bRun = true;
      m_pThread = AfxBeginThread(RUNNER, new tdata(this, 230));
    } 
    
    void CNThreadDlg::stop() {
      m_bRun = false;
    }
    
    UINT CNThreadDlg::RUNNER(LPVOID param) {
      tdata data = *(static_cast<tdata*>(param));
      return data.pDlg->run(data.Range);
    }
    

    Das ganze hat meiner Meinung nach den Vorteil, dass die Datenkapselung erhalten bleibt.
    Nur meine Klasse und Kinder kennen die Threadmethode.
    Durch mein Übergabestruct kennt der Thread (ist ja klassenübergreifend) seine Klasse.


Anmelden zum Antworten