Multithreading - Globale Variablen



  • Hallo, das ist ein Thema, wo mir sogar das formulieren der Frage schwer fällt 🙂 :

    Ich habe eine Klasse, in der ich einen eigenen Thread starte. Diese Klasse installiert einen HOOK auf das Hauptfenster der App. In der Hookproc greife ich nun über einen Globalen Pointer auf die aktive Klasse auf diese zu. In etwa so:

    static Condition *gActCondition = NULL;//Global Pointer to the Active Condition Object
    LRESULT CALLBACK Condition::ConditionHook( int code, WPARAM wParam, LPARAM lParam )
    {
        if(!gActCondition)
            return NULL;
        if( code >= 0 )
        {
            MSG* theMsg = (MSG*)lParam;
            UINT uiRequiredMessage = gActCondition->GetConditionMessage();//gActCondition->GetConditionMessage()-1; 
    .........
    

    Somit habe ich in gActCondition einen Pointer auf das aktive Objekt. Das ganze funktioniert auch, solange ich nicht mehrere Klassen vom Typ Condition parallel laufen habe. Also dachte ich mir ich deklariere mein globale Variable einfach als Threadlokal mit:

    __declspec (thread) static Condition gThreadCondition = NULL;
    

    Wunderbar, somit hat jedes Objekt seine eigene globale Variable, da ja jedes Objekt in einem eigene Thread läuft. Leider gehört ja aber mein HookProc (Condition::ConditionHook) zum Hauptthread der App. Somit habe ich zwar eine schöne Threadlokale Variable, komme aber da, wo ich sie brauche nicht ran (ist dann immer NULL - klar).
    Gibt es dafür irgendeine schöne Lösung? Meine einzige Idee wäre ein globales Array von Instanzpointern anzulegen, und jeder Klasseninstanz eine eigene ID mitzugeben und somit das ganze aufzulösen. Ich habe einen schönen Artikel darüber gefunden unter

    http://www.codeproject.com/win32/callback_adapter.asp

    Leider steige ich da nicht ganz durch. Die Problematik bleibt doch in meinem Fall die selbe oder?



  • So, jetzt habe ich das ganze in einer globalen Liste gemacht. D.h. beim Starten eines Threads hänge ich den this Pointer an. In der HookProc muß ich dann halt durch die komplette Liste springen und somit jedes Objekt durchgehen. Naja, nicht schön - aber seeehr selten...


Anmelden zum Antworten