一定の時間間隔で画面を更新したい (V5R4)

WRKSYSACT や WRKACTJOB の F17 キーなどで、画面を何秒おきかで自動的に最新情報を表示させるようにすることができますね。
状態を監視するツールなどで同じようなことをしたい、と思ったことはありませんか??

実際にそういったコマンドがどういう機能を使っているかはわかりませんが、同じような機能を実装するカンタンな例を今回は紹介したいと思います。


データ待ち行列と表示装置ファイルの機能を利用して実装します。

DSPF

まず、表示装置ファイルのコーディング例から見てみましょう。

レコード様式レベルで INVITE を指定しています。
時間の経過がわかりやすいように TIME キーワードで時刻を表示させるようにしています。

     A                                      CA03(03)                                                
     A          R REC                       INVITE                                                  
     A                                  4 20TIME                                                    
     A            DA1           10A     6 20                                                        
     A                                 23  4'F3 End Job'                                            

DSPF にデータ待ち行列を指定します。

CRTDSPF FILE(DSPTEST/REFRESH_DA) SRCFILE(DSPTEST/QDDSSRC) DFRWRT(*NO) DTAQ(DSPTEST/TIMINGDTAQ)

DTAQ

もちろんデータ待ち行列は作成しておく必要がありますね。
サイズは 80バイトです。

CRTDTAQ DTAQ(DSPTEST/TIMINGDTAQ) MAXLEN(80)

ILE RPG

表示装置を使う RPG です。
それほど難しいことはないと思いますが、データ待ち行列を一定間隔で受けとることができることを利用して、これをいわば"クロック"として使っている、というのがポイントですかね。

     FRefresh_DAcf   E             workstn                                                          
      *                                                                                             
     DRcvDtaQ          PR                  extpgm('QRCVDTAQ')                                       
     D DtaQName                      10    const                                                    
     D DtaQLib                       10    const                                                    
     D ReceiverLen                    5  0                                                          
     D Receiver                       1    options(*varsize)                                        
     D Wait                           5  0 const                                                    
      *                                                                                             
     D MsgSize         s              5  0                                                          
     D Msg             s             80                                                             
     D TimeToWait      s              5  0 inz(10)                                                  
      *                                                                                             
     D DA1             s             10    dtaara                                                   
      *                                                                                             
      /free                                                                                         
                                                                                                    
         dow not *in03;                                                                             
             in DA1;                                                                                
             write Rec;                                                                             
             RcvDtaQ('TIMINGDTAQ' :'DSPTEST' :MsgSize :Msg :TimeToWait);                   
             select;                                                                                
               when MsgSize = 0;                     // time out                        
               when %subst(Msg :1 :10) = '*DSPF';    // input from dev                           
                    read Rec;                                                                       
               other;                                // unexpected input or error
             endsl;                                                                                 
         enddo;                                                                                     
                                                                                                    
         *inlr = *on;                                                                               
         return;                                                                                    
                                                                                                    
      /end-free

↑の例では、データエリアを一定間隔で読んで表示するようにしていますので、その間隔内にデータエリアを変更すれば最新情報が表示されるようになっています。
もちろん、ファイルを読んでも API などで何かの情報を取得しても同じことなので、なるべくシンプルな例でシミュレーションしてみました。

実行例

まず、データエリアの内容をセットします。

こんな画面が表示されます。

データエリアの内容を更新してみましょう。

自動的に画面は更新されていきますが、データエリアの更新後はそれが反映されているのがわかります。

参照情報

全体のロジックについてはインフォメーション・センターの「例: 表示装置ファイルおよびデータ待ち行列からの入力を待機する」が参考になると思います。

データ待ち行列がなぜ 80桁なのか、その内容は QRCVMSGQ の 4つめのパラメータにある msg というフィールドに入ってくるのですが、そのレイアウトはどうなっているのか、については「例: 表示装置ファイルおよび ICF ファイルからの入力を待機する」を参照してください。

wait の仕組み、たとえば QRCVMSGQ の 3つめのパラメータが 0 だとなぜタイムアウトなのか、などについては「例: データ待ち行列からのデータの受け取りに、最大 2 時間待機する」を参照してください。

[Top Pageに戻る]

Ads by TOK2