DLYJOB меньше секунды.


Главная Форумы IBM i (OS/400) DLYJOB меньше секунды.

В этой теме 5 ответов, 3 участника, последнее обновление  Sever 5 года/лет, 8 мес. назад.

  • Автор
    Сообщения
  • #14272

    Sever
    Участник

    Необходимо в CL-нике организовать задержку порядка 200-500 миллисекунды. В CL организованная через DLYJOB задержка может быть минимум 1 секунда. Как решить проблему? Какие есть варианты?

  • #14273

    andrewk
    Участник

    маленькая программа на Си 🙂

  • #14274

    Sever
    Участник

    На С пробовал, не получилось.
    Не мой это язык.

    На RPG (был найден вариант в тырнете) получилось, но некрасиво…

    [code] *— uSleep — uSleep function (delay job for microseconds ) ——
    * (999999 microseconds = just less than 1 second.)

    * unsigned int uSleep( unsigned int microseconds );

    D uSleep PR 10I 0 ExtProc(‘usleep’)
    D 10U 0 Value
    C *ENTRY PLIST
    C PARM dly 10 0

    * Sleep for just less than one second
    C CallP uSleep(dly )
    C return
    [/code]

    В итоге, задействовал usleep в CL.
    Вот что получилось:

    Программа CLLE:

    [code]DLYMILSEC: PGM PARM(&MILLISECND)
    DCL VAR(&MILLISECND) TYPE(*DEC) LEN(4 0) /* max = 1000 */
    DCL VAR(&MICROSECND) TYPE(*DEC) LEN(7 0)
    DCL VAR(&VALUE) TYPE(*UINT) LEN(4)
    DCL VAR(&RETURNED) TYPE(*INT) LEN(4)
    IF COND(&MILLISECND *LE 0) THEN(GOTO CMDLBL(EXIT))
    CHGVAR VAR(&MICROSECND) VALUE(&MILLISECND * 1000)
    CHGVAR VAR(&VALUE) VALUE(&MICROSECND)
    CALLPRC PRC(‘usleep’) PARM((&VALUE *BYVAL)) +
    RTNVAL(&RETURNED)
    EXIT: ENDPGM [/code]

    Сверху CL команда как интерфейс вызова:

    [code] DLYMILSEC: CMD PROMPT(‘Delay Job in milliseconds’)
    PARM KWD(MILSEC) TYPE(*DEC) LEN(4 0) RANGE(0 1000) +
    MIN(1) PROMPT(‘Number of milliseconds’) [/code]

    Пример вызова c prompt-ом:

    [code] Delay Job in milliseconds (DLYMILSEC)

    Введите варианты, нажмите Enter.

    Number of milliseconds . . . . . _____ 0-1000 [/code]

  • #14275

    andrewk
    Участник

    хм.

    [code]
    $ cat usleep.c
    #include
    #include

    int main(int argc, char *argv[])
    {
    if (argc < 2) {
    fprintf(stderr, "usage: usleep usecn");
    return -1;
    }

    return (usleep(atoi(argv[1])));
    }

    $ cc usleep.c -o usleep
    $ time ./usleep 500000

    real 0m0.50s
    user 0m0.00s
    sys 0m0.00s
    [/code]

    но это конечно unix-way — без всяких промптов и прочих интерфейсов 🙂

  • #14310

    Jevgeni Astanovski
    Участник

    [code]
    #include
    #include
    #include
    #include

    int main(int argc, char *argv[])
    {
    int FullTime, Minutes, Seconds, uSeconds ;
    _MI_Time WaitTime ;

    if (argc != 2)
    {
    printf(«Illegal usage: wait n») ;
    return(1) ;
    }
    FullTime = atoi(argv[1]) ;
    uSeconds = (FullTime % 1000) / 10 ;
    Seconds = (FullTime / 1000) % 60 ;
    Minutes = (FullTime / 60000 ) % 60 ;

    mitime(&WaitTime, 0, Minutes, Seconds, uSeconds) ;
    waittime(&WaitTime, _WAIT_NORMAL) ;
    return(0) ;
    }
    [/code]

    Это на ILE/C. Использует функцию waittime из MI.
    uSeconds — это сотые доли секунды, не миллисекунды. А на вход принимает миллисекунды.

    Проверил. Работает.

  • #14317

    Sever
    Участник

    Спасибо всем.

Для ответа в этой теме необходимо авторизоваться.