Nochmals ObjMarkDirty

  • Ich verwende ja in der MSG_GEN_PROCESS_CLOSE_APPLICATION Methode die Function ObjMarkDirty() um die "aktiven" Objekte in de State zu bekommen. Das funktioniert soweit ganz gut, nur Swat meckert und verabschiedet sich mit "Death due to block not locked".

    Code
    ObjMarkDirty(@LadderView);
    ObjMarkDirty(@LadderGameActors);
    ...

    Das sind alles abgeleitet Vis-Klassen und eigentlich alle in der selben Ressource. Wenn ich versuche das zu Locken, stirbt der Patient mit CANNOT_CALL_MEM_LOCK_ON_AN_OBJECT_BLOCK.

    Code
    MemLock(OptrToHandle(@LadderView));

    Irgendwie hänge ich hier. Ohne Swat funktioniert es ansonsten wie gewünscht. Die Objekte behalten Ihren State über einen Neustart.

    In den Quellen gibt es auch nur sehr weniges dazu. Meistens ist es auch noch jeweils auskommentiert...

  • Du musst die normalen Objekte nicht extra dirty setzen. Das passiert automatisch, zumindest bei Gen-Objkete. Bei Vis bin ich mir nicht sicher, denke aber auch. Am besten ausprobieren.

    Ansonsten: Die Messages, die du den Objekten sendest haben oftmals einen "Objekt-Flags" Parameter. Da kannst du oft auch ein Mark-Dirty Flag übergeben.

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

  • Sie sind eben leider nicht automatisch Dirty. Ohne ObjMarkDirty() haben sie nach einem Neustart die Default-Werte. Mit kommen sie dann auch wieder mit den richtigen Werten.

    Ich Frage mich nur, warum Swat will, dass ich Locke, aber dann reklamiert, dass Ressourcen mit ui-objekt Attribut nicht gelockt werden dürden.

  • Ich habe das ausprobiert:

    Code
    ObjLockObjBlock(OptrToHandle(@LadderView));

    Jetzt bekomme ich eine Meldung wegen falschen Thread:

    Ich bin da ja im Process-Thread und das Objekt ist im Application-Thread...

  • Ich würde jetzt versuchen, für deine Objekte eine Methode zu defineren (MSG__MY_OBJ_MARK_DIRTY), nichts weiter tut, als "sich selbst" Dirty zu machen, mit ObjMarkDirty(oself). Die rufst du dann in CLOSE_APPLICATION vor @callsuper(). Sobald das Objekt eine Methode ausführt, ist es immer gelockt.

    Leider habe ich keine "vordefinierte" Message gefunden die das macht. Was ich erstaunlich finde.

    Rainer

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

  • Noch ein Zwischenstand. Es gibt eine Message, nur war mir das nicht so offensichtlich:

    Code
    @call LadderView::MSG_META_SET_FLAGS(OptrToChunk(@LadderView), OCF_DIRTY, 0);
    @call LadderGameActors::MSG_META_SET_FLAGS(OptrToChunk(@LadderGameActors), OCF_DIRTY, 0);
    ...

    Ich werde es aber noch über den Weg meiner View versuchen, diese sich selbst und ihre Kinder mit einer Message auf Dirty zu setzen.

  • Hier noch meine aktuelle Implementierung...

    APPLICATION CLOSE:

    Code
    optr o;
    // Mark the visible objects dirty
    o = @call LadderView::MSG_GEN_VIEW_GET_CONTENT();
    @call o::MSG_SCN_MARK_DIRTY();

    MARK DIRTY:

    Muss dies dann noch mit EC ALL testen...

  • Die Schleife könnte ein Problem haben,. wenn du KEINE Children hast. Ansonsten sollte es so gehen.
    Irgendwo gibt es sowas wie @send-to-Vis-Children. ich glaube das läuft über @record Da müsste ich jetzt aber graben ...

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

  • Hallo Rainer

    Alle LadderScreen Objekte haben Kinder (composites). Wenn keine vorhanden wären, würde ich eine 0 für n erwarten. In dem Fall sollte die for-Schleife nicht erfüllt sein (i und n sind 0, i < n nicht wahr) ... oder sehe ich das falsch?

    Das mit dem @visChildren geht leider nur mit @send. Hier aber sollte ich sicherstellen, dass die Methoden sicher aufgerufen wurden und Objekte sich als Dirty markiert haben.

    Herzlichen Dank und ich bin immer offen für Hinweise ;)

    Andreas

  • Kleiner Tipp: Nach Möglichkeit „++i“ statt „i++“ nutzen.

    ++i inkrementiert i um 1 (äquivalent zum Assembler-Befehl „INC“).

    i++ ist nur eine Kurzschreibweise für „i = i + 1“. Es wird also erst das Ergebnis von „i + 1“ berechnet, dann wird das Ergebnis der Variable i zugewiesen. (Jedenfalls, wenn der Compiler hier keine Optimierungen macht.)


    Das Ergebnis der beiden Varianten ist zwar identisch, i++ benötigt allerdings (ohne Optimierung) mehr Rechenschritte und ist dadurch langsamer.

    There are two rules in life:
    1. Never give out all of the information.

  • jpolzfuss das mit der Optimierung war mir auch nicht bewusst. ... laut C-Doku führt er bei ++i das Erhöhen vor der Verwendung von i aus, bei i++ (irgendwann) nach der Verwendung von i. Very confusing. In der Schleife sollte da aber egal sein.

    bolle732 du scheinst recht zu haben, laut Internet ist for() in C abweisend. Ich hab immer geglaubt sie sei nicht abweisend. Trotzdem - oder deswegen - und auch zur Klarheit würde ich persönlich hier versuchen while zu verwenden: while(numChildren>0) { .... numChildren--; }

    Solange alle deine Children sicher in der gleichen Ressource wie das Parent liegen, ist die Lösung sehr schön. Tun sie es nicht, hast du wieder das ObjMarkDirty()-Problem vom Anfang.

    Rainer

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

  • Solange alle deine Children sicher in der gleichen Ressource wie das Parent liegen, ist die Lösung sehr schön. Tun sie es nicht, hast du wieder das ObjMarkDirty()-Problem vom Anfang.

    Ja, das tun sie zum Glück und sollte auch nicht anders werden ;)

    Das mit den Schleifen und dem Erhöhen vor- / nachher ist interessant. Mir ist die For persönlich geläufiger. Bei While fange ich immer an weiterzudenken, ob ich da nicht irgendeine eine Endlos-Schleife baue :/

  • Noch ein Gedanke zu "mark dirty": das typische Muster, das ich immer für so ein Flag im Kopf habe, ist dass man ein Objekt "dirty" setzt, sobald man irgendwelche Änderungen daran macht, die man speichern will. Es ist dann eher so was wie der Zustand "nicht gespeichert" bei einem Dokument.

    Aber wenn sich der Zustand sowieso immer ändert, reicht es auch, einmal am Ende alles pauschal "dirty" zu setzen.