COBOL 中的命令等待?

Command Wait in COBOL?

COBOL 中有一种"Wait" 函数吗? 我写了一个计算器,为了让它更像 50 年代,我打印了“计算”。 "Computing.." EC 例如:

                   DISPLAY "SECONDO NUMERO"
                   ACCEPT B
                   COMPUTE C= A * B
                          DISPLAY "Computing"
                          DISPLAY "Computing."
                          DISPLAY "Computing.."
                          DISPLAY "Computing..."
                          DISPLAY "Computing...."
                          DISPLAY "Computing....."
                          DISPLAY "Computing......"
                          DISPLAY A "x" B " FA..."
                          DISPLAY C

现在,有没有办法在我放置 "Computing" 片段的 COBOL 上稍微延迟(半秒)?我为这个项目创建了一个 github repo (https://github.com/aIDserse/Super-utility-Submachine-COBOL-CALCULATOR),查看它(参考版本 1.3)以获取完整代码(并可能再传播它哈哈)。谢谢!!!

标准 COBOL 中没有等待或延迟语句。对于 GnuCOBOL,可能会有一个 CALL "SYSTEM" 来实现延迟。

我获取了一些用于经过时间测量的代码并修改了代码以创建延迟程序。

任何需要延迟的地方,插入语句PERFORM timed-delay。当然,延迟可以改变。此代码设置为即使延迟超过午夜也能正常工作。

代码:

   working-storage section.
   01 t pic 9(8).
   01 t-start.
     03 t-start-hour pic 99.
     03 t-start-minute pic 99.
     03 t-start-second pic 99v99.
   01 t-end.
     03 t-end-hour pic 99.
     03 t-end-minute pic 99.
     03 t-end-second pic 99v99.
   77 t-elapsed pic 9(7)v99.
   procedure division.
   begin.
       accept t from time
       display t
       perform timed-delay
       accept t from time
       display t
       stop run
       .

   timed-delay.
       accept t-start from time
       move 0 to t-elapsed
       perform until t-elapsed > 0.5   *> one-half second
           accept t-end from time
           perform get-elapsed
       end-perform
       .

   get-elapsed.
       if t-start > t-end
           move 86400 to t-elapsed
       else
           move 0 to t-elapsed
       end-if
       compute t-elapsed = t-elapsed
         + (t-end-hour - t-start-hour) * 3600
         + (t-end-minute - t-start-minute) * 60
         + (t-end-second - t-start-second)
       end-compute
       .

输出:(显示延迟 0.55 秒)

21424364
21424419

最初的 PERFORM WITH TEST AFTER ... 与我在 中提供的代码完全不同,因此我将其转为注释。它应该被删除。

如果您想使用SLEEP-SEC而不是固定值,请将0.5替换为SLEEP-SEC;但在显示菜单之前为 SLEEP-SECMOVE 提供一个 VALUE 子句。

例如,在您的代码中(删除了大部分代码):

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01  SLEEP-SEC PIC S9(2)V9(2).
   01  A PIC S9(7)V9(7).
   01  B PIC S9(7)V9(7).
   01  C PIC S9(7)V9(7).
   01  D PIC S9(11)V9(7).
   01  INPUT1 PIC 9(14).
   01  Q PIC X VALUE "Y".
   01 t-start.
     03 t-start-hour pic 99.
     03 t-start-minute pic 99.
     03 t-start-second pic 99v99.
   01 t-end.
     03 t-end-hour pic 99.
     03 t-end-minute pic 99.
     03 t-end-second pic 99v99.
   77 t-elapsed pic 9(7)v99.

       PROCEDURE DIVISION.
   MAIN.
  *    PERFORM WITH TEST AFTER
  *        UNTIL Q ="YES" OR "Y" OR "y" OR "yes" OR "Yes"
  *    END-PERFORM.
       DISPLAY "CALCULATOR".
       DISPLAY "WHAT DO YOU WANT DO DO?".
       DISPLAY "1 ADDITION".
       DISPLAY "15 EXIT"
       DISPLAY "CHOOSE AN OPTION"
       ACCEPT INPUT1
       EVALUATE  INPUT1

       WHEN = 15
            DISPLAY "OK, GOOD JOB :)"
            STOP RUN

       WHEN = 1
       DISPLAY "FIRST NUMBER"
       ACCEPT A
       DISPLAY "SECOND NUMBER"
       ACCEPT B
       COMPUTE C= A + B
               DISPLAY "Computing"
       PERFORM timed-delay
               DISPLAY "(" A ")" "+" "(" B ")" "RESULTS..."
               DISPLAY C

       END-EVALUATE

               IF INPUT1 NOT = 15
           DISPLAY "DO YOU WANT TO DO OTHER CALCULATIONS?"
           ACCEPT Q
           IF Q = "YES" OR "Y" OR "y" OR "yes" OR "Yes" GO TO MAIN
               ELSE DISPLAY "OK, GOOD JOB :)"
              END-IF
              STOP RUN.

   timed-delay.
       accept t-start from time
       move 0 to t-elapsed
       perform until t-elapsed > 0.5   *> one-half second
           accept t-end from time
           perform get-elapsed
       end-perform
       .

   get-elapsed.
       if t-start > t-end
           move 86400 to t-elapsed
       else
           move 0 to t-elapsed
       end-if
       compute t-elapsed = t-elapsed
         + (t-end-hour - t-start-hour) * 3600
         + (t-end-minute - t-start-minute) * 60
         + (t-end-second - t-start-second)
       end-compute
       .

对于 GnuCobol,调用 C$SLEEP 并指定您要等待的秒数。

CALL "C$SLEEP" USING 2 END-CALL

COBOL 没有内置语言功能来处理等待。这是一个系统特定的请求,我相信总是需要调用一个外部模块来与所述系统交互。

任何 ISO 标准 COBOL 中都没有等待语句。

但是,如果您内置了 system routines 可用的 C$SLEEP(秒)或 CBL_GC_NANOSLEEP(纳秒)应该可以解决问题。

示例(休眠半秒):

call "CBL_GC_NANOSLEEP" using "500000000" end-call

对于 IBM 的企业 COBOL(启用 LE),CEE3DLY 例程最合适(还有其他遗留例程可用)。

在标准 COBOL 中有一个休眠语句,但只有 COBOL 202x:

           CONTINUE AFTER arithmetic-expression SECONDS

由于该标准处于委员会草案状态,因此很难找到实现,但正如您要求的 GnuCOBOL - GnuCOBOL 3.1 已经实现了它。

除此之外,还有一些方言特定的库例程可以使用,例如 CALL "C$SLEEP" 来自 ACUCOBOL-GT(也使用 GnuCOBOL 实现,但请注意 3.1 之前的版本仅使用非 -小数部分,所以 "0.9" 将休眠零秒)。

对于 OpenCOBOL/GnuCOBOL,您可以调用 CBL_OC_NANOSLEEP/CBL_GC_NANOSLEEP 库例程。

对于任何可以调用本机例程的 COBOL 环境,您都有 CALL "sleep".

的变体

As 许多 COBOL 实现还实现了一个可调用的 SYSTEM ,您可以在其中使用类似 ping localhost 的超时,但无论您调用什么都可能不可用(或者进程 运行 COBOL 环境无权访问它)。

Stephen Gennard 一个非常常见的扩展名:

           ACCEPT something WITH TIMEOUT

其中有一个 "beware" 不同的环境使用不同的尺度(一些秒,一些毫秒)。这具有 pro/con 用户可以通过按键(通常是功能键) "break" 输出;以及它可能仅适用于 "graphical" 环境的附加问题。

Anton 的回答突出了 IBM 库例程 CEE3DLY