View Full Version : DLYJOB im CL
loeweadolf
15-07-06, 23:22
Im CL kann ich DLYJOB benutzen mit Angabe von einer Anzahl Sekunden, die gewartet werden soll.
Gibt es eine kleinere Einheit als Sekunden ?
Ich möchte gerne 1/5 Sekunde angeben.
mfg. Ludger
kuempi von stein
16-07-06, 07:40
Hello,
mir persönlich ist da nix bekannt.
Abgesehen davon, dass das System eh macht was es will. (Will sagen, wenn man sagt DLYJOB X kanns machmal auch ein wenig mehr sein, wie beim Fleischer)
Du könntest Dir ne eigene Schleife basteln, die so ungefähr Deine Anforderung abdeckt.....
k.
Es gibt hierzu einen MI-Befehl, der einen Wait als kleinste Einheit von 1ms erlaubt.
Hier noch meine Quelle (mit meinem MI-Compiler oder dem API zu erstellen):
DCL SPCPTR PWAITDECTIME PARM;
DCL OL *ENTRY (PWAITDECTIME) PARM EXT;
DCL DD WAITDECTIME PKD(15,0) BAS(PWAITDECTIME);
DCL DD WAITSTRUCT CHAR(16);
DCL DD WAIT1 BIN(4) DEF(WAITSTRUCT) POS(1);
DCL DD WAIT2 BIN(2) UNSGND DEF(WAITSTRUCT) POS(5);
DCL DD * BIN(2) DEF(WAITSTRUCT) POS(7) INIT(0);
DCL DD WAITOPT CHAR(2) DEF(WAITSTRUCT) POS(9)
INIT(X"2000");
DCL DD * CHAR(6) DEF(WAITSTRUCT) POS(11)
INIT((6)X"00");
DCL DD GESAMTZEIT PKD(31,0);
#DEBUG
ENTRY * (*ENTRY) EXT;
CMPNV(B) WAITDECTIME,0/HI(ZEIT_POSITIV);
NEG(S) WAITDECTIME;
ZEIT_POSITIV:
MULT(R) GESAMTZEIT,WAITDECTIME,P"0.625142";
DIVREM WAIT1,GESAMTZEIT,P"65536",WAIT2;
#NODEBUG
BRK ".WAITTIME";
WAITTIME WAITSTRUCT;
#DEBUG
RTX *;
DCL EXCM MCH1202 EXCID(H'0C02',H'0C0A') BP(FEHLER) IMD
CV(X"00000000");
FEHLER:
CPYNV WAITDECTIME,P"100000";
B ZEIT_POSITIV;
PEND;
loeweadolf
16-07-06, 13:20
@ kuempi
Mit der Schleife (Zähler laufen lassen) möchte ich nicht arbeiten. Die Systeme werden immer schneller und um dieselbe Wartezeit zu erreichen, müsste der Zähler immer höher geschraubt werden.
@baldur
ich habe mich noch nicht mit MI-Compiler etc. beschäftigt. Vielleicht mal später, wenn ich mehr Zeit habe.
Vielen Dank für die Antworten
Ludger
Viel einfacher ist es doch die sleep() funktion in einen rpg-program zu benutzen.
loeweadolf
17-07-06, 08:43
Viel einfacher ist es doch die sleep() funktion in einen rpg-program zu benutzen.
Wie geht das ?
mfg.
Viel einfacher ist es doch die sleep() funktion in einen rpg-program zu benutzen.
Korrigiere mich, sollte ich falsch liegen aber ...
soweit ich weiß, kann man bei sleep() auch nur Sekunden und keine kleinere Zeiteinheit angeben!
Birgitta
sleep() auf der AS/400 funktioniert tatsächlich anders.
Diese Funktion ist auf jedem System anders implementiert und hängt häufig von TICKS-Parameter ab.
Auf der AS/400 ist das leider 1 Sekunde, unter Windows 1/1000-Sekunde, unter Unix/Linux (eben je nach Implementation) auch schom mal 1/60-Sekunde.
Doch hier nun für alle RPG-ILE-Freaks:
hactgrp(*caller) dftactgrp(*no) bnddir('QC2LE')
d WaitTime pr extproc('waittime')
d pMI_Time 8
d pMI_Options 5U 0 value
d WaitInterval ds 8
d WaitPart1 10U 0
d WaitPart2 10U 0
d WAIT_NORMAL c const(0)
d WAIT_MOD_AS_ENTER...
d c const(32768)
d WAIT_MOD_AS_LEAVE...
d c const(16384)
d WAIT_MPL_SET c const(8192)
d WAIT_SIGNALS c const(4096)
d WaitOptions s 5U 0 inz(WAIT_NORMAL)
d WaitFactor s 15p 5
d WaitMSeconds s 21p 0
c *entry plist
c parm WaitFactor
c
c eval WaitMSeconds = WaitFactor * 1000000
c if WaitMSeconds = *zero
c return
c endif
c
c eval WaitPart1 = %div(WaitMSeconds:1048576)
c eval WaitPart2 = %rem(WaitMSeconds:1048576) * 4096
c
c callp WaitTime(WaitInterval:WaitOptions)
c return
Das Aufsplitten des Intervals liegt in der internen Darstellung eines Zeitwertes in Microsekunden (1/1000000) in den Bits 1-56 (57-64 = *4096) müssen 0 sein.
Hallo,
mit usleep geht's etwas einfacher. Funktioniert genauso wie sleep, nur dass man die Delay-Zeit in Mikrosekunden angibt. Nachfolgend ein Beispiel für fast 1 Sekunde:
D uSleep PR 10I 0 ExtProc('usleep')
D 10U 0 Value
*
C CallP uSleep(999999)
Gruß,
KM
Ok, sleep() oder usleep() abhaengig davon wie genau man es haben moechte. Es funktioniert.
Sleep well :rolleyes:
Gruss
Helge Bichel