-
Parameter des aurufenden Programms ermitteln
Hallo zusammen!
Seit 2 Tagen schlage ich mich mit folgendem Problem rum. Aus einem ILERPG-Programm rufe ich eine Prototyped-Procedure auf. In dieser Procedure möchte ich auf die Parameter des aufrufenden Programms zugreifen.
Mittlerweile habe ich herausgefunden, das mir die API QWVRCSTK Informationen über das aufrufende Programm geben kann. Aber weiter komme ich an der Stelle nicht.
Desweiteren habe ich festgestellt, dass die Offsets zu den Parameter immer 32Bit auseinander liegen. Wenn das generell so ist, würde es mir ja reichen die Adresse des ersten Parameters zu übergeben. Aber ist das auch wirklich immer so?
Vielen Dank schon mal im voraus.
-
Auf Adressen des rufenden Programmes zuzugreifen ergibt meistens MCH-Fehler.
Die Parameter lassen sich auch nicht ermitteln, da Parameterlisten ganz anders übergeben werden als z.B. in C/C++.
Wozu soll das ausserdem gut sein ?
Programme/Funktionen bekommen ihre Parameter immer übergeben, die sie benötigen !
-
Der Hintergund ist folgender:
Diverse Programme werden durch ein übergeordnetes Programm steuernd aufgerufen. Dabei könne die Programm sowohl parallel als auch sequentiell abgearbeitet werden. Das steuernde Programm muss nun wissen, wann sich die einzelnen Programme beenden um weitere Aktionen auszuführen.
Dazu habe ich ein Modul erstellt, welches entsprechende Einträge in einer Tabelle vornimmt. Dieses Modul benötigt nun die selben Parameter wie das aufgerufene Programm.
Ich möchte jetzt lediglich die "Tipparbeit" für den Modul-Aufruf klein halten.
Anstelle von
LogOff(#MAND:#ID:#STEP:#TASK) fände ich es angenehmer nur
LogOff() eingeben zu müssen.
-
Definiere den Prototyp folgendermaßen.
d pr logoff
d 10a options(*nopass)
d 10a options(*nopass)
d 10a options(*nopass)
d 10a options(*nopass)
In der Prozedur "logoff" kannst dann folgendes abfragen.
if %parms = 0, wenn logoff folgendermaßen aufgerufen wurde LogOff()
if %parms = 4, wenn logoff folgendermaßen aufgerufen wurde LogOff(#MAND:#ID:#STEP:#TASK)
Frank Hildebrandt
-
Hallo,
erst mal der guten Ordnung halber: parallel läuft im RPG in einem Job nix, das geht immer sequentiell.
Den Informations Übergang könnte man auch durch Variablen Export/Import lösen, das ist aber vom Design her eher schlechtallerdings immer noch besser als dein (wohl nicht Ziel führender) Versuch.
mfg
Dieter Bender
Zitat von GreatEMU
Der Hintergund ist folgender:
Diverse Programme werden durch ein übergeordnetes Programm steuernd aufgerufen. Dabei könne die Programm sowohl parallel als auch sequentiell abgearbeitet werden. Das steuernde Programm muss nun wissen, wann sich die einzelnen Programme beenden um weitere Aktionen auszuführen.
Dazu habe ich ein Modul erstellt, welches entsprechende Einträge in einer Tabelle vornimmt. Dieses Modul benötigt nun die selben Parameter wie das aufgerufene Programm.
Ich möchte jetzt lediglich die "Tipparbeit" für den Modul-Aufruf klein halten.
Anstelle von
LogOff(#MAND:#ID:#STEP:#TASK) fände ich es angenehmer nur
LogOff() eingeben zu müssen.
-
Da du ILERPG benennst, kann ich Dieter nur zustimmen.
Parallelverarbeitung gibts da nicht.
Entweder die Funktion/das Programm ist aktiv, oder das rufende Programm ist aktiv.
Falls du C-Funktionen für Threads verwendest, dann lass die Finger davon, da RPG/ILERPG nicht threadsave ist (automatic/static Storage).
-
Zitat von Frank Hildebrandt
Definiere den Prototyp folgendermaßen.
d pr logoff
d 10a options(*nopass)
d 10a options(*nopass)
d 10a options(*nopass)
d 10a options(*nopass)
In der Prozedur "logoff" kannst dann folgendes abfragen.
if %parms = 0, wenn logoff folgendermaßen aufgerufen wurde LogOff()
if %parms = 4, wenn logoff folgendermaßen aufgerufen wurde LogOff(#MAND:#ID:#STEP:#TASK)
Das bringt mich nicht weiter, da ich in dem Modul die Parameter benötige.
Zitat von BenderD
erst mal der guten Ordnung halber: parallel läuft im RPG in einem Job nix, das geht immer sequentiell.
Mein steuerndes Programm ruft die "Unterprogramme" per SBMJOB auf. Das meinte ich mit parallel.
Ich habe es jetzt erstmal so gelöst, dass ich meine Parameter in eine Datenstruktur packe und den Zeiger auf die Datenstruktur übergebe. Somit habe ich nur einen (konstanten) Parameter den ich übergeben muss. Damit habeich dann auch die Tipperei ein wenig eingeschränkt.
Trotzdem vielen Dank für euer Bemühen.
-
jo, datenstruktur issn plan.
schreibs in die *LDA
die wird beim sbmjob ja mitgegeben.
und du hast keine komischen dtaaras auf platte rumliegen, die du nacher wieder aufräumen musst.
dann brauchst du eigentlich gar keine parameter fürs logoff()
Gruß
Martin
-
Hallo,
das geht auch einfacher: du brauchst nur die Datenstruktur als Parameter übergeben, das macht bereits dasselbe ohne Pointer.
Ich würde zur Kommunikation der Tochterprozesse mit dem steuernden Prozess DataQs oder Messages vorziehen.
Anzumerken hätte ich noch, dass ein sterbender Prozess, normalerweise nix einträgt (lässt sich mit CEE4RAGE weitest gehend verhindern) und damit kriegst du eine nicht auflösbare Wartebedingung. Zuweilen ist es auch ganz gut, wenn man so einen Tochterprozess einen Lock auf einen Monitor machen lässt (DTAARA dxxxxxx mit xxxxxx = Jobnummer), oder einen Recordlock auf einen Eintrag in einer Spertable, dann kann man bequem warten, bis der fertig ist, oder feststellen ob der noch lebt.
mfg
Dieter Bender
Zitat von GreatEMU
Das bringt mich nicht weiter, da ich in dem Modul die Parameter benötige.
Mein steuerndes Programm ruft die "Unterprogramme" per SBMJOB auf. Das meinte ich mit parallel.
Ich habe es jetzt erstmal so gelöst, dass ich meine Parameter in eine Datenstruktur packe und den Zeiger auf die Datenstruktur übergebe. Somit habe ich nur einen (konstanten) Parameter den ich übergeben muss. Damit habeich dann auch die Tipperei ein wenig eingeschränkt.
Trotzdem vielen Dank für euer Bemühen.
-
@angelone. Danke!
Das ist genau die Lösung, nach der ich gesucht habe.
@BenderD: Mit DataQueues arbeiten wir mittlerweile auch an anderer Stelle. Aber diese "Prozesssteuerung" ist mittlerweile so "alt" gewachsen, dass ich die sehr ungerne komplett umstellen möchte.
Den sterben Prozess fange ich im steuernden Programm mit einer maximalen Laufzeit ab, die ich dem Unterprozess zu Verfügung stelle. Dein Vorschlag würde den Tod natürlich schneller feststellen.
-
Hallo,
wenn du mit CEE4RAGE einen ILE Exit Handler registriert, wird der von der runtime automatisch aufgerufen, wenn die Activation Group beendet wird, also auch wenn der Job stirbt, geht eigentlich immer (vermutlich bei Stecker raus und endjobabn nicht), der kann dan was in dein proclog reinschreiben.
mfg
Dieter Bender
PS: naja, mit dem LDA...
Zitat von GreatEMU
@angelone. Danke!
Das ist genau die Lösung, nach der ich gesucht habe.
@BenderD: Mit DataQueues arbeiten wir mittlerweile auch an anderer Stelle. Aber diese "Prozesssteuerung" ist mittlerweile so "alt" gewachsen, dass ich die sehr ungerne komplett umstellen möchte.
Den sterben Prozess fange ich im steuernden Programm mit einer maximalen Laufzeit ab, die ich dem Unterprozess zu Verfügung stelle. Dein Vorschlag würde den Tod natürlich schneller feststellen.
Similar Threads
-
By Jenne in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 23-02-07, 13:46
-
By Bratmaxxe in forum NEWSboard Programmierung
Antworten: 9
Letzter Beitrag: 08-01-07, 09:50
-
By Weki in forum NEWSboard Server Software
Antworten: 6
Letzter Beitrag: 29-08-06, 09:09
-
By JonnyRico in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 30-03-06, 12:33
-
By Spirou in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 17-04-02, 09:54
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks