Parameter an User Interface Thread übergeben



  • Hallo alle...

    Habe mal wieder 'ne Frage:
    Gibt es eigentlich eine Möglichkeit, einem User Interface Thread zusätzliche Parameter mitzugeben?
    Ich starte meinen Thread mit folgender Methode:

    CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
    

    Dabei wird dann in der InitInstance der von CWinThread abgeleiteten Klasse ein neues Dialogfeld erzeugt.
    Nun müsste ich noch Parameter übergeben können, was aber mit der oben genannten Methode nicht geht?? Ich mache die Parameterübergabe momentan über ein File, dies ist jedoch immer ein wenig unsicher...Klappt nicht immer. 😞

    Gibt es da irgend einen Weg?

    Gruz

    Dan



  • Dann starte deine Thread Suspend, übergib im den Parameter und führe ihn dann aus.
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39101.html

    Wie heißt in deinem Code oben der CWinThreadZeiger?

    Weiters frage ich mich wie du den dann wieder löchen willst wenn du deinen Thread so startest.



  • Übergib doch eine Struktur.
    Ich mache die Threadfunktion als Klassenmethode. Zusätzlich erstelle ich ein Struct welches alle benötigten Daten enthält.

    Das Beispiel ist auf das Wichtigste beschränkt.
    [cpp]
    //NThreadDlg.h
    class CNThreadDlg : public CDialog {
    proteced:
    // 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)
    {}

    void 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));
    data.pDlg->run(data.Range);
    return 0;
    }[/cpp]



  • @Unix-Tom: Den obenstehenden Code habe ich aus der MSDN.
    Bei meinem Code habe ich ein Array mit mehreren CWinThread Pointers angelegt und greife dann auch immer via Array auf den spezifischen Thread zu, wenn ich das muss.
    Ich starte die Threads auch einmal, dann müssen sie bis zum Beenden der APP laufen. Ich muss sie also nicht wieder löschen...
    Ich werde mir das mit dem Suspend mal ansehen, danke...

    @hehejo: Danke für den Schnipsel...Ich werde es sobald ich dazukommen mal auschecken... 😃

    Gruz

    Dan


Anmelden zum Antworten