[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Nun denn, da hat ja IBM am Speichermodell massiv geändert.
    Aus MI-Sicht gibt es eben 2 Speicher, Static und Auto.
    Bei der Deklaration von Variablen gibt man per INZ die Initialisierung beim Start an.
    Beim Verlassen eines Programmes wurde die MI-Anweisung "Deaktivere Programm" vor dem Return ausgeführt.
    Damit wurde das Programm aus dem Speicher entfernt, so dass beim nächsten Aufruf die Initialisierungen durch das MI wieder erfolgten.

    Mit dem ILE hat sich das wohl geändert, so dass globale und statische Variablen nicht mehr per INZ sondern per Code initialisiert werden, anders lässt sich das nämlich nicht erklären.

    Ein ILE-Programmobjekt wird wohl jetzt erst entfernt, wenn die ACTGRP beendet wird.
    Innerhalb der DFTACTGRP reicht dann ein RCLRSC.

    Damit erklärt sich nun auch der z.T. erhebliche Speicherverbrauch bei ILE.
    Im Lebenszyklus eines Dialogjobs werden ja mitunter 1000de Programme aufgerufen.
    Auch wenn also jedes Programm mit *INLR = *ON verlassen wird, so verbleibt es wohl doch im Speicher bzw. alle statischen Variablen bleiben aktiv.
    Das ist schon eine ganze Menge.

    Ein weiterer Effekt ist nun, dass eine benannte ACTGRP nun nicht mehr beendet wird, wenn das oberste Programm mit LR = *ON endet, siw wird nur als inaktiv aufgeführt!
    Das funktioniert nun nur bei ACTGRP(*NEW).
    Wenn ich also meinen Job sauber aufräumen will muss ich also tatsächlich bei benannten ACTGRP's einen RCLACTGRP anfordern damit der Speicher aufgeräumt wird, *INLR reicht nicht mehr.

    Jetzt frage ich mich allerdings, wie man denn tatsächlich ein Programm gezielt aus einer ACTGRP entfernen kann. Unter OPM gab es dafür die Anweisung "FREE", die in ILE nicht mehr erlaubt ist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #14
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das einzige, was sich da geändert hat, ist das Handling von LR!
    bei OPM: Programm wird aus dem Speicher gelöscht
    bei ILE: Programm wird nicht gelöscht, sondern global (static) Vars initialisiert (bei SRVPGM keine Auswirkung)
    Das war aber bei ILE von Beginn an so!

    ACTGRP *NEW für Programme ist keineswegs ein Allheilmittel, das führt nämlich dazu, dass alles, was untendrunter mit *CALLER läuft neu aktiviert wird, auch wenn es bereits anderweitig im Speicher ist.

    Irgendwo in der Mitte bewegt man sich, wenn man bei Programmen ACTGRP = Programmname verwendet, dann kann man wenigstens gezielt deaktivieren, wenn man RCLACTGRP Programmname macht. Bei klarem ILE Design, wo man in einem Job nur 1 Programm aktiv hat und alle Subfunktionen in SRVPGMs sind, ist dies auch meine Empfehlung.

    Speicherverbrauch ist auf einer AS/400 eigentlich eher unkritisch (->Single level store), die Aktivierung ist da meist dominierend, sprich große Speichermengen zu holen ist teuer, da das einpagen in kleinen Dosen erfolgt und nicht sehr effizient ist. Meist ist drinlassen und verdrängen lassen die bessere Wahl.

    Noch eine Anmerkung zu ACTGRP und SRVPGM: Für Zustandsbehaftete SRVPGMs ist *CALLER am Besten, Zustandslose ACTGRP = SRVPGMName oder gleich fester Wert (bei mir NORECLAIM)

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #15
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    "Bei klarem ILE Design, wo man in einem Job nur 1 Programm aktiv hat..." ist ja in Dialogjobs nicht durchführbar. Aus einem Menü heraus kann ich zig Programme aufrufen, die nun ja nach ILE alle im Speicher bleiben.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #16
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... natürlich ist das durchführbar, pro Anwendung reicht ein main, der Rest sind SRVPGMs. Wenn allerdings im Callstack mehrere Programme übereinander liegen, die dann wieder gemeinsam dieselben SRVPGMs nutzen, spätestens dann kann von klarem ILE Design keine Rede mehr sein.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #17
    Registriert seit
    Oct 2013
    Beiträge
    171
    Das klingt aber mehr nach einem nachprogrammierten DFU als nach einer feinen 5250-Anwendung.
    Aus der Auftragserfassung im Matchcode einen Fehler bei einem Kunden entdecken und in der Kundenstammwartung beheben - ich kenne mehrere Pakete, in denen so etwas möglich ist, ohne wieder ins Menü zurückzusteigen.
    Wäre dann nur das Menü das Programm und alles andere in Serviceprogrammen, um als echte ILE-Anwendung durchzugehen?

  6. #18
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... das hat mit "durchgehen" nix zu tun und mit DFU erst recht nicht. Um bei Deinem Beispiel zu bleiben, wäre der Aufruf aus dem Kundenstamm in der Tat ein procedure call mit einer Verzweigung in ein SRVPGM der Kundenstammwartung. Ob man nun einen einzigen Einstieg (= Programm), oder mehrere hat, hängt dann von der Paketierung der Module ab.
    Implementiert man das über programm calls, kriegt man die Probleme, die manche Anwendung damit hat, Vermeidung von Rekursion, Verlust von Informationen bei Rücksprüngen aus tieferer Verschachtelung etc.; das ist mit ILE einfacher zu kontrollieren, da man da flexibler einen gemeinsamen Informationshaushalt abbilden kann, der den Status des gesamtem Prozesses beinhaltet.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Anzahl der Host-Variablen geringer als die Ergebniswerte
    By hartmuth in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 18-09-14, 09:57
  2. Begrenzung im Debugger bei der Anzeige von Variablen erhöhen?
    By SourceCoder in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 03-04-14, 11:22
  3. CL Variablen konvertieren
    By danielfeurstein in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 22-07-02, 15:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •