MetaClass / GenClass Life-Cycle

  • Hallo zusammen

    Ich versuche eine eigene generische Klasse zu verwenden. Dies sieht ungefähr folgendermassen aus:

    Von dieser Klasse habe ich ein Objekt:

    Code
    @start TEST;
    @object TestWorkerClass TestWorker = {
      TWI_mode = 3;
    }
    @end TEST;

    Nun habe ich versucht, dieses Objekt zu verwenden. Meiner Meinung nach müsste die Methode MSG_TEST_WORKER_GET_MODE() den Wert 10 zurückgeben. Ich erhalte aber die 3. Das wiederum würde bedeuten, dass die Methode MSG_META_INITIALIZE() nicht aufgerufen wurde. Wenn ich diese von Hand aufrufe, dann bekomme ich im Nachhinein auch den richtigen Wert.

    Muss ich meine eigenen Objekte speziell registrieren, damit die MSG_META_INITIALIZE() beim Starten der Anwendung und somit der Instanziierung des Objektes ausgeführt wird? Oder liegt es an der Platzierung im Gen-Tree? (habe bis jetzt GenPrimary versucht)

    Ist es richtig, dass die Messages vom process-Thread verarbeitet werden?

    Besten Dank schon einmal für Eure Hints ;)

    Edited once, last by bolle732 (October 29, 2024 at 11:08 AM).

  • Hallo Andreas,

    guggst du Doku...

    MSG_META_INITIALIZE

    Code
    void	MSG_META_INITIALIZE();

    Every object class should provide a handler for this message which should call the superclass and then perform any initialization of the instance data required. This message is not delivered to statically declared objects because they are already initialized.

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • guggst du Doku...

    MSG_META_INITIALIZE

    Code
    void	MSG_META_INITIALIZE();

    Every object class should provide a handler for this message which should call the superclass and then perform any initialization of the instance data required. This message is not delivered to statically declared objects because they are already initialized.

    Hallo Rainer

    Danke für Dein Feedback. Genau die Funktion MSG_META_INITIALIZE() verwende ich ja. Die Dokumentation dazu habe ich mir mehrfach durchgeschaut und auch den von Dir erwähnten Abschnitt gelesen. Entweder habe ich irgendwas übersehen oder verstehe eine grundlegende Geschichte nicht...

    Die Methode muss man in der Klasse ja nicht definieren, da sie geerbt wird (MetaClass / GenClass). Wenn ich die Methode in der APPLICATION_OPEN von Hand aufrufe, macht sie, was sie soll. Aber das müsste in meinen Augen doch automatisch beim Instanziieren geschehen.

    Andreas

  • Sorry, ich wollte dir nicht auf den Schlips treten 😇Ja callsuper ist das erste und du hast das Objekt ststisch deklariert (im UI code). Dann bekommt es die Message nicht. So interpretiere ich den Text.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Ok, das mit dem statisch definieren vs. zur Laufzeit erzeugen könnte die Ursache sein. Was wäre hier wohl der Hintergrund dafür?

    Das Objekt soll so quasi ein "Singleton" werden. Das wird dann von diversen Stellen aus über Messages angesprochen. Die dynamisch zur Laufzeit zu machen fände ich etwas overkill.

    Wenn das so gegeben ist, dann werde ich die MSG_META_INITIALIZE() wie bis anhin einfach in der APLLICATION_OPEN aufrufen.

  • Was immer ein Singleton ist :)
    Üblicher Weise definiert man doch zum Belegen der Instancevariablen eigene Messages. Mir erschließt sich auch nicht, warum du im UI-code einen anderen Wert vorgibst als du dann später initial brauchst ... Warum belegst du nicht TWI_mode gleich mit 10?

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Hallo Rainer

    Ein Singelton ist meiner Erinnerung nach eine Klasse, von der genau nur EIN Objekt instanziiert wird.

    Die TestWorker-Klasse und die Instanzvariable TWI_mode sind als Beispiel zu sehen. Ich habe aber einen Fall, bei dem ich in der Instanzvariable einen Wert ablegen möchte, welcher sich je nach System / Sitzung unterscheiden kann. Dieser Wert muss ich einmal ermitteln und ist dann während der Laufzeit des Programms immer gleich. Solche Fälle gibt es meiner Meinung nach doch recht häufig. Und mit der Message MSG_META_INITIALIZE() hätte PC/GEOS das doch genau. Nur verstehe ich nicht, warum das nur für zur Laufzeit erzeugte Objekte aufgerufen werden soll und für Statische nicht.

    Wenn dieses Verhalten bei PC/GEOS so vorgegeben oder "by design" ist, dann ist es eben so. Wenn es aber möglich wäre, dass PC/GEOS automatisch die MSG_META_INITIALIZE() auch bei statischen Objekten aufrufen kann, dann würde ich dies gerne benutzen. Das befreit den Programmierer dies händisch zu machen. Bonus wäre natürlich noch eine geerbte Methode um allfällige allozierte Resourcen wieder freizugeben,

    Andreas

  • Das mit den verschiedenen MSG_META_ATTACH habe ich auch versucht. Bis anhin entweder kein Effekt oder böse Crashes...

    Wenn ich dem GenApplication über die Instanzvariable GI_comp den @TestWorker neben dem GenPrimary anhänge, produziert das keinen Crash. Aber die MSG_META_ATTACH_OBJECT() wird soweit ich sehe nicht aufgerufen.

    Durchsucht man die Sourcen, dann findet man hier eigentlich nur Fälle, wo MSG_META_ATTACH_OBJECT von der GenApplication selbst überschrieben wird. Brauchen tue ich es aber auf dem TestWorker selbst.