Contextspezifische globale/statische Variablen/Funktionen



  • Vielleicht ist der Begriff doppeldeutig ...

    Sowas gibts durchaus für Threads, nennt sich dann zum Beispiel "Thread Local Storage".

    Siehe:
    http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_local_storage.html

    Jetzt kommt meine Frage:

    Wie realisiert man das ohne Threads?

    Natürlich ist folgender Trick immer möglich :

    Context* static GetMyContext(int secret_code);
    

    Ich würde gerne diese Magic Number verstecken!
    Denn statt des secret_code kann ich mir genauso einen ContextPointer speichern ...
    Diesen Wert muss man dann überall "durchschleifen" 👎

    mfg
    nurF



  • Was willst du genau erreichen? Inwiefern haben Threads etwas mit deinem Problem zu tun?

    Wenn es dir nur darum geht, die Magic Numbers zu verstecken, benutze am besten ein enum . Dann hast du auch Typsicherheit.



  • Nexus schrieb:

    Was willst du genau erreichen? Inwiefern haben Threads etwas mit deinem Problem zu tun?

    Wenn es dir nur darum geht, die Magic Numbers zu verstecken, benutze am besten ein enum . Dann hast du auch Typsicherheit.

    Ich hab disjunkte Code-Teile A und B, die in verschiedenen Kontexten laufen können. Kontext könnte auch einfach nur Thread bedeuten.

    Will nun A eine Nachricht an B schicken, holt sich A den aktuellen Kontext (Thread)

    Zusammengefaßt:

    GetMyContext()->SendMessage("B", "Hello World");
    

    Ich will unbedingt sowas vermeiden wie :

    GetMyContext(this)->SendMessage("B", "Hello World");
    GetMyContext(&A)->SendMessage("B", "Hello World");
    

    oder eben wie im Post #1.

    Der entsprechende Kontext(Thread) wird erst zur Laufzeit zugewiesen.
    Der Kontext in meinem Fall ist ein ganzes EventSystem bzw. eine EventLoop.

    Der Enum bringt mich da nicht unbedingt weiter ...



  • du musst den aktuellen kontext setzen.

    zB wenn der event dispatch laeuft, dann pusht du den aktuellen kontext eben auf das entsprechende event und wenn der dispatch zuende ist, dann popst du kontext wieder.



  • Shade Of Mine schrieb:

    du musst den aktuellen kontext setzen.

    Ok, habe ich grundsätzlich nichts gegen.

    ... dann pusht du den aktuellen kontext eben auf das entsprechende event ...

    Könntest du das genauer erklären. Ich kann mit dieser Beschreibung leider nichts anfangen.



  • nurf schrieb:

    Vielleicht ist der Begriff doppeldeutig ...

    Sowas gibts durchaus für Threads, nennt sich dann zum Beispiel "Thread Local Storage".

    Siehe:
    http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_local_storage.html

    Jetzt kommt meine Frage:

    Wie realisiert man das ohne Threads?

    Ohne Threads nennt sich das "globale Variable" 😕



  • nurf schrieb:

    Könntest du das genauer erklären. Ich kann mit dieser Beschreibung leider nichts anfangen.

    Wenn jetzt einen neuen Kontext betrittst (zB event dispatching) dann pusht du diesen context auf einen stack und getContext() liefert dir das oberste Element aus dem Stack.

    Wenn du nun einen nächsten Kontext betrittst, pusht du wieder auf den Stack und hast somit einen neuen Kontext. Wenn du diesen verlässt, popst du das oberste Element und übrig bleibt der zuletzt gesetzte Kontext...


Anmelden zum Antworten