【问题标题】:Command Wait in COBOL?COBOL 中的命令等待?
【发布时间】:2020-05-18 00:58:54
【问题描述】:

COBOL 中是否有一种“等待”功能? 我写了一个计算器,为了让它更像 50 年代,我打印了“计算”。 “计算..” ecc 例如:

                   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

现在,有没有办法在我放置“计算”部分的 COBOL 上进行一点延迟(半秒)?我为这个项目创建了一个 github repo (https://github.com/aIDserse/Super-utility-Submachine-COBOL-CALCULATOR),查看它(参考 1.3 版)以获得完整的代码(也许可以传播它哈哈)。谢谢!!!

【问题讨论】:

    标签: cobol gnucobol


    【解决方案1】:

    在标准 COBOL 中有一个 sleep 的声明,但仅限于 COBOL 202x

               CONTINUE AFTER arithmetic-expression SECONDS
    

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

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

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

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

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

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

               ACCEPT something WITH TIMEOUT
    

    它有一个“小心”,不同的环境使用不同的规模(几秒,几毫秒)。这具有用户可以通过按键(通常是功能键)“打破”的优点/缺点;以及它可能仅适用于“图形”环境的附加问题。

    Anton 的回答重点介绍了 IBM 库例程 CEE3DLY

    【讨论】:

      【解决方案2】:

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

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

      例子(睡半秒):

      call "CBL_GC_NANOSLEEP" using "500000000" end-call
      

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

      【讨论】:

        【解决方案3】:

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

        CALL "C$SLEEP" USING 2 END-CALL
        

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

        【讨论】:

          【解决方案4】:

          标准 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 ... 和我在Cobol-Restart from the program 中提供的代码完全不同,所以我把它变成了cmets。它应该被删除。

          如果要使用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
                 .
          

          【讨论】:

            猜你喜欢
            • 2011-10-20
            • 2017-03-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多