static Variablen in einer lib synchron halten, wenn lib mehrmals verwendet



  • Hallo,

    ich habe im Gesamtprojekt eine .lib, mit der Basisklasse Basis mit einer static Variablen namens StaticValue.
    Diese .lib wird von mindestens 2 weiteren Projekten(sagen wir Klasse A und Klasse 😎 des Gesamtprojektes dazugebunden. B ist Kind von Basis.

    Wie kann ich es realisieren, dass in allen Projekten die static Variable StaticValue der .lib synchron läuft, egal wie ich darauf zugreife, da die .lib oder zumindest die static Variable mehrmals in verschiedenen Speicherbereichen zu existierenscheint:

    Basis::StaticValue = ...
    Innerhalb Kind Klasse: this->StaticValue = ...
    Innerhalb Kind Klasse: Basis::StaticValue = ...

    usw.

    Da muss es doch irgendwie was mit #pragma geben.

    Danke.



  • C++Friend schrieb:

    ich habe im Gesamtprojekt eine .lib, mit der Basisklasse Basis mit einer static Variablen namens StaticValue.
    Diese .lib wird von mindestens 2 weiteren Projekten(sagen wir Klasse A und Klasse 😎 des Gesamtprojektes dazugebunden. B ist Kind von Basis.

    Was genau meinst Du mit "Projekt" und "Gesamtprojekt"? Meinst Du mit Projekt ein Modul in demselben Prozess, oder ist für Dich ein Projekt ein eigenständiger Prozess?

    C++Friend schrieb:

    Wie kann ich es realisieren, dass in allen Projekten die static Variable StaticValue der .lib synchron läuft, egal wie ich darauf zugreife, da die .lib oder zumindest die static Variable mehrmals in verschiedenen Speicherbereichen zu existierenscheint

    Das kommt drauf an. Wenn es verschiedene Prozesse sind (jeder Prozess hat sein eigenes Datensegment), bräuchtest Du eine Art Interprozesskommunikation. Dazu könntest Du TCP/IP "missbrauchen" oder ein anderes systemspezifisches Protokoll.

    Wenn es sich um ein einziges Programm handelt, gib doch mal ein paar mehr Beispiele (inklusive Code) und sag, was Du eigentlich bezwecken willst (Dein übergeordnetes Ziel).



  • Hallo,

    also Gesamtprojekt ist für mich eine Projektmappe mit lauter Projekten drinnen, so wie es VS2005 macht.
    Es ist keine Multithreading Anwendung.



  • Diese Erklärung von "Projekt" hat nicht viel dazu beigetragen, Dein Problem besser zu verstehen. Mir ging es ja darum, rauszubekommen, ob es sich bei deinem "Gesamtprojekt" um versch. Prozesse handelt, die miteinander reden müssen, oder nicht.

    C++Friend schrieb:

    Es ist keine Multithreading Anwendung.

    Aha. Und was meinst Du mit "Anwendung"? Einen einzelnen Prozess?

    Beschreibe das Problem besser. Was und wie hast Du ausprobiert -- und warum?
    Du musst schon mit mehr Infos rausrücken.



  • Hallo,

    also:

    Die Projektmappe sieht wie folgt aus:
    -Startprojekt mit main() usw (Win32 Konsolenanwendung).
    -Eine Lib mit der Klasse Basis.
    -Eine Dll mit der Klasse Kind die von Basis public abgeleitet wird.
    -Eine Lib mit der Klasse T.

    Es liegt nur ein Prozess vor, in dem eben entweder über Funktionen der Klasse T auf Basis::StaticValue oder innerhalb eines Onjektes der Klasse Kind mit this->StaticValue zugegriffen wird.

    Überall sollte nun der selbe wert in StaticValue stehen.

    Danke.



  • Wenn es ein Prozess ist, sollte die statische Variable immer gleich sein (static halt).
    Ich nehme an, dass eine lokale Variable mit dem selben Namen in der abgeleiteten Klasse die statische Variable überdeckt.
    Zeig mal Originalcode, dass man deinen Fehler sieht.



  • @l'abra d'or:
    Wenn er z.B. drei DLLs hat, die alle eine .LIB verwenden, und die drei DLLs in den selben Prozess lädt, dann hat er drei Kopien der statischen Variablen der .LIB in seinem Prozess.

    Lösung: eine .DLL aus der .LIB machen.

    p.S.: bei SOs unter Linux ist das soweit ich weiss nicht so, da gäbe es tatsächlich nur eine Kopie. Von daher kann einen das schon verwirren, wenn man von einem System zum anderen wechselt.



  • Hallo,

    ich teile die Meinung von hustbaer, denn ich habe festgestellt, dass die statischen Variablen bei mir tatsächlich unterschiedliche Adressen haben.

    Danke an alle die geantwortet haben.


Anmelden zum Antworten