AfxBeginThread() - mehrere Parameter übergeben



  • Hallo liebe Community,
    Sitze im Moment an der Stelle fest wo ich eine Funktion durch einen Thread zyklisch ausführen lassen möchte. Was ich bis jetzt weiss nimmt man dafür die AfxBeginThread()Funktion und übergibt ihr als Parameter die auszuführende Funktion + EINEN Parameter für die auszuführende Funktion.
    Nun zu meinem issue:
    ich kann ja nur einen Parameter für die auszuführende Funktion übergeben - meine braucht aber drei Parameter (zwei integer und einen Pointer auf den DeviceContext). Wie macht man sowas???

    Es würde mich freuen wenn mir jeamand helfen könnte.



  • Du könntest dir ne Struktur/Klasse anlegen in der die werte enthalten sind und diese Struktur/Klasse dann übergeben



  • Hi,

    meiner Meinung nach gibt es zwei Möglichkeiten.
    1. Du machst Dir eine Struktur und übergibst diese:

    struct MyThreadParameter
    {
       int value1;
       int value2;
       void* pDeviceIO;
    }
    
    void StartThread()
    {
       // parameter anlegen (muss natürlich auf den Heap!)
       MyThreadParameter* params = new MyThreadParameter;
    
       // parameter füllen...
    
       AfxBeginThread(ThreadFunc, (LPVOID)params);
    }
    
    UINT ThreadFunc(LPVOID lpv)
    {
       MyThreadParameter* pParameter = reinterpret_cast<MyThreadParameter*>(lpv);
    
       // mach was....
    
       // abräumen
       delete pParamater;
    
       return 0;
    }
    

    oder den wie ich finde besseren Weg über den this-Zeiger:

    class CMyWorker
    {
     public:
       CMyWorker() {};
       ~CMyWorker() {};
    
       void StartThread();
    
     protected:
    
      static UINT ThreadFunc(LPVOID lpv);
    
     private:
    
       int m_v1;
       int m_v2;
       void* m_pDeviceIO;
    }
    
    void CMyWorker::StartThread()
    {
       // member sind durch setter oder sonstwie gesetzt worden!
    
       AfxBeginThread(ThreadFunc, this);
    }
    
    UINT CMyWorker::ThreadFunc(LPVOID lpv)
    {
       CMyWorker* pThis = reinterpret_cast<CMyWorker*>(lpv);
    
       // mach was....
    
       pThis->m_v1 = 100;
       pThis->m_v2 = 300;
    
       return 0;
    }
    

    zwei Beispiele, wie man es machen kann.

    Gruss
    EB



  • Danke für die wertvollen Anregungen, ich probier's heute noch aus und melde mich ob's geklappt hat.



  • Hallo EB,
    habe gestern sehr lange an deiner ersten Methode gesessen (die mit dem Struct) und habe es dann doch nicht hingekriegt:( Die zweite Methode (this-Pointer) klappte dafür auf Anhieb!!! Das mit der Strukturübergabe scheiterte bei mir vermutlich daran dass das MFC keine Zugriffe auf den DeviceContext-Pointer CDC* pDC (ich wollte ja mit dieser Funktion zeichnen) ausserhalb der OnDraw()-Methode zulässt. Ich konnte diesen Pointer zwar ohne Kompilierfehler in die Struktur "verpacken" und nach dem "auspacken" hat der Intellisense auch den Pfeiloperator(->) erkannt usw. aber sobald ich das Prog gestartet habe stürzte es genau an der Stelle ab, wo die pDC-Zugriffe sind... Desweiteren hat die Struct-Methode den Nachteil dass sie zwingend static sein muss und der Compiler Aufrufe bestimmter Funktionen darin nicht erlaubt (z.B. GetClientRect oder GetDC). Genauso besitzen die statischen Funktionen keinen this-Pointer was das Anlegen des CClientDC dc.(this) erschwert... Aber mit der Übergabe des this-Pointers klappte das dann auch am Ende. Vielen Dank ich habe durch deine Antwort viel gelernt:)



  • Hi,

    schön das du einiges gelernt hast und es klappt.

    Vor- bzw. Nachteile hast du bereits erkannt, was jedoch nicht heist, das
    du z.B. GetClientRect nicht aufrufen kannst. Du must dann halt die WINAPI
    benutzen statt die MFC Klassen. D.h. das deine Struktur auch ein Handle
    auf das Fenster haben muss. Egal, die Methode mit dem this-Zeiger ist meiner
    Meinung nach auch die bessere.

    Aber Vorsicht, mit Zugriffen aus dem Thread zum Fenster. Das geht nur
    wenn die MFC-Methoden Nachrichten senden. Das siehst Du im Source der MFC.
    Sonst verletzt du schnell einige ASSERTS in der MFC.

    Gruss
    EB



  • Hi Forum,
    wie kann man den Thread mit einem Parameter aufrufen:

    AfxBeginThread(MyFunc, cStringParam);
    

    endet mit fehler:
    error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'

    MyFunc ist so deklariert:

    UINT MyFunc(LPVOID pObject);
    

    Ich möchte das ein string in der Funktion verarbeitet wird, leider klappts nicht!

    danke
    mirsad


Anmelden zum Antworten