Lesson-4:JV-Dataのダウンロード/読み込み進捗状況を表示する

Lesson-4:JV-Dataのダウンロード/読み込み進捗状況を表示する

当コーナーでは、Microsoft Visual Basic 2022 Professional Edition(以下VB 2022と省略)で「JRA-VAN Data Lab.」サービス対応の競馬ソフトを作成していく過程をステップアップ形式で解説していきます。
前回までで、実際にJV-Dataをダウンロードして内容を表示する簡単な仕組みを実装しました。今回は、プログレスバーを追加して、JV-Dataのダウンロード/読み込み処理の進捗情報を表示できるようにしてみましょう。

【 今回の目標 】

プログレスバーを追加してJV-Dataのダウンロード/読み込み進捗状況を表示する。

具体的には、プログレスバーを2本用意して、JV-Dataのダウンロード進捗状況と読み込み進捗状況をそれぞれ表示する。

JV-Linkに実装されている以下のメソッドの使い方を理解する。

JVStatusメソッドでJV-Dataのダウンロード進捗情報を取得する。

【 やってみよう 】

① Lesson-3までを実装したフォーム(frmMain)を含むプロジェクトを開きます。
(前回のレッスンの続きから開始するのであれば、この作業は必要ありません。)

② フォームにプログレスバー(ProgressBar)を2つ追加し、各ProgressBarのプロパティを以下のように変更します。

上段のProgressBarのデザイン-「(Name)」:prgDownload
下段のProgressBarのデザイン-「(Name)」:prgJVRead

[ ワンポイントメモ ]
上段のプログレスバーではJV-Dataのダウンロードの進捗状況を、下段のプログレスバーではJV-Dataの読み込みの進捗状況をそれぞれ表示します。

③ フォームにタイマー(Timer)を追加し、プロパティを以下のように変更します。

デザイン-「(Name)」 : tmrDownload
動作-「Enabled」 : False
動作-「Interval」 : 500

[ ワンポイントメモ ]
JV-DataのダウンロードはJVOpen後、バックグラウンドで実行されるので、タイマーを用いて定期的に進捗状況をチェックします。

④ フォーム「frmMain」のコードエディタウィンドウを表示します。
(ソリューションエクスプローラの「From1.vb」右クリックし、メニューの中から「コードの表示」をクリックします。

⑤ コードエディタウィンドウ上部にある左側リストボックスから「frmMain」を選択後、以下のソースコードを入力します。


追加するコード [ソースコード 006-01]

Private lDownloadCount As Long           ''JVOpen:総ダウロードファイル数
Private JVOpenFlg As Boolean            ''JVOpen状態フラグ Opne時:Ture

⑥ コードエディタウィンドウで「データ取得」ボタンクリック時の処理を修正します(**部分は前回コーディング済)。

*Private Sub btnGetJVData_Click(ByVal sender As System.Object, ByVal e As *
*System.EventArgs) Handles btnGetJVData.Click*

*    Dim lReturnCode As Long*

*    Try*
*        Dim strDataSpec As String        '' 引数 JVOpen:ファイル識別子*
*        Dim strFromTime As String        '' 引数 JVOpen:データ提供日付*
*        Dim lOption As Long              '' 引数 JVOpen:オプション*
*        Dim lReadCount As Long           '' JVLink 戻り値*
*        Dim strLastFileTimestamp As String '' JVOpen: 最新ファイルのタイムスタンプ*

*        Const lBuffSize As Long = 110000  ''JVRead:データ格納バッファサイズ*
*        Const lNameSize As Integer = 256  ''JVRead:ファイル名サイズ*
*        Dim strBuff As String             ''JVRead:データ格納バッファ*
*        Dim strFileName As String         ''JVRead:ダウンロードファイル名*
*        Dim RaceInfo As JV_RA_RACE        ''レース詳細情報構造体*

        '進捗表示初期設定
        tmrDownload.Enabled = False       ''タイマー停止
        prgDownload.Value = 0             ''JVDataダウンロード進捗
        prgJVRead.Value = 0               ''JVData読み込み進捗

*        '引数設定*
*        strDataSpec = "RACE"*
*        strFromTime = "20050301000000"*
*        lOption = "2"*

*        ' JVLinkダウンロード処理*
*        lReturnCode = Class1.AxJVLink.JVOpen(strDataSpec, strFromTime, lOption, _*
*                        lReadCount, lDownloadCount, strLastFileTimestamp)*

*        'エラー判定*
*        If lReturnCode <> 0 Then*
*            MsgBox("JVOpenエラー:" & lReturnCode)*
*        Else*
*            MsgBox("戻り値 : " & lReturnCode & vbCrLf & _*
*               "読み込みファイル数 : " & lReadCount & vbCrLf & _*
*               "ダウンロードファイル数 : " & lDownloadCount & vbCrLf & _*
*               "タイムスタンプ : " & strLastFileTimestamp)*

            '進捗表示プログレスバー最大値設定 ***Point1***
            If lDownloadCount = 0 Then
                prgDownload.Maximum = 100           ''ダウンロード必要無し
                prgDownload.Value = 100
            Else
                prgDownload.Maximum = lDownloadCount
                tmrDownload.Enabled = True          ''タイマー開始
            End If
            prgJVRead.Maximum = lReadCount

*            If lReadCount > 0 Then*
*                Do*
                    'バックグラウンドでの処理を実行 ***Point2***
                    Application.DoEvents()

*                    'バッファ作成*
*                    strBuff = New String(vbNullChar, lBuffSize)*
*                   strFileName = New String(vbNullChar, lNameSize)*

*                    'JVReadで1行読み込み*
*                    lReturnCode = Class1.AxJVLink.JVRead(strBuff, lBuffSize, _*
* strFileName)*
*                    'リターンコードにより処理を分枝*
*                    Select Case lReturnCode*
*                        Case 0      ' 全ファイル読み込み終了*
                            prgJVRead.Value = prgJVRead.Maximum   '進捗表示
*                            Exit Do*
*                        Case -1 ' ファイル切り替わり*
                            prgJVRead.Value = prgJVRead.Value + 1 '***Point3***
*                        Case -3     ' ダウンロード中*
*                        Case -201   ' Initされてない*
*                            MsgBox("JVInitが行われていません。")*
*                            Exit Do*
*                        Case -203   ' Openされてない*
*                            MsgBox("JVOpenが行われていません。")*
*                            Exit Do*
*                        Case -503   ' ファイルがない*
*                            MsgBox(strFileName & "が存在しません。")*
*                            Exit Do*
*                        Case Is > 0 ' 正常読み込み*
*                            'レコード種別IDの識別*
*                            If Mid(strBuff, 1, 2) = "RA" Then*
*                                'レース詳細のみ処理*
*                                'レース詳細構造体への展開*
*                                RaceInfo.SetData(strBuff)*

*                                'データ表示*
*                                rtbData.AppendText( _*
*                                   "年:" & RaceInfo.id.Year & _*
*                                   " 月日:" & RaceInfo.id.MonthDay & _*
*                                   " 場:" & RaceInfo.id.JyoCD & _*
*                                   " 回次:" & RaceInfo.id.Kaiji & _*
*                                   " 日次:" & RaceInfo.id.Nichiji & _*
*                                   " R:" & RaceInfo.id.RaceNum & _*
*                                   " レース名:" & RaceInfo.RaceInfo.Ryakusyo10 _*
*& vbCrLf)*
*                            End If*
*                    End Select*
*                Loop While (1)*
*            End If*

            'タイマ有効時は、無効化する ***Point4***
            If tmrDownload.Enabled = True Then
                tmrDownload.Enabled = False
                prgDownload.Value = prgDownload.Maximum
            End If

*        End If*

*    Catch*
*        Debug.WriteLine(Err.Description)*
*        Exit Sub*
*    End Try*

*    'JVLink終了処理*
*    lReturnCode = Class1.AxJVLink.JVClose()*
*    If lReturnCode <> 0 Then*
*        MsgBox("JVClseエラー:" & lReturnCode)*
*    End If*
*End Sub*

・Point1
JV-Dataをダウンロードする必要がなければ、ダウンロード進捗状況を100%にしてしまう。この場合タイマーを動かす必要はない。

・Point2
ループ毎にDoEvents処理を実行し、他のイベント(この場合タイマーイベント)処理が行われるための隙間を作ります。

・Point3
1ファイル読み込む毎に全読み込みファイル数の対するJV-Data読み込み進捗状況を表すプログレスバーを進めます。

・Point4
JV-Dataのダウンロード処理の進捗状況が100%になる前にJV-Dataの読み込み処理の進捗状況が100%になってしまった場合のための処理を記述します。これを記述しておかないと、タイマー間隔を長く設定した際にエラーが発生する可能性があります。
なお、Lesson-3でプロシージャ「btnGetJVData_Click ()」の中で宣言したlDownloadCountは削除しておきます。

コードエディタウィンドウの左側リストボックスから「tmrDownload」を、右側リストボックスから「Tick」を選択すると、tmrDownloadのメソッドが追加されるので、以下の[ソースコード006-03]を追加します。

[ ワンポイントメモ ]
フォームの下の「tmrDownload」アイコンをダブルクリックしてもtmrDownloadのメソッドが追加されます。


[ソースコード006-03]

Private Sub tmrDownload_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrDownload.Tick

    Dim lReturnCode As Long                ''JVLink返値

    'JVLinkダウンロード進捗率
    lReturnCode = Class1.AxJVLink.JVStatus       ''ダウンロード済のファイル数を返す

    'エラー判定
    If lReturnCode < 0 Then
        'エラー
        MsgBox("JVStatusエラー:" & lReturnCode)
        'タイマー停止
        tmrDownload.Enabled = False

        'JVLink終了処理
        lReturnCode = Class1.AxJVLink.JVClose()
        If lReturnCode <> 0 Then
            MsgBox("JVClseエラー:" & lReturnCode)
        End If
    ElseIf lReturnCode < lDownloadCount Then
        'ダウンロード中
        'プログレス表示  ***Point1***
        prgDownload.Value = lReturnCode
    ElseIf lReturnCode = lDownloadCount Then
        'ダウンロード完了
        'タイマー停止
        tmrDownload.Enabled = False
        'プログレス表示
        prgDownload.Value = lReturnCode
    End If

End Sub

③でタイマーを追加したときに、「Interval」に500を設定したので、タイマーがスタートしてから500 ms ごとにこのメソッドが呼び出されます。

・Point1
ダウンロード済みのファイル数を取得してダウンロード用のプログレスバーの Value プロパティに設定することにより、プログレスバーの表示を更新します。

【 確認しよう 】

それでは、実際に動かしてみましょう。
① メニューから「デバッグ」→「デバッグ開始」を選択し、プログラムを実行します。エラーが発生した場合は、タスク一覧にエラーメッセージが表示されるので、正しく修正してエラーが無くなるまでビルドします。

② JV-Linkを使用するための「利用キー」を設定していない場合は、メインフォーム上のメニューから「設定」→「JV-Linkの設定」を選択し、「利用キー」を設定します(詳細はLesson-1を参照)。

③ フォームの「データ取得」ボタンをクリックすると、メッセージボックスがポップアップします。メッセージボックスには、リターンコードや読み込みファイル数、ダウンロードファイル数、最新読み込みファイルのタイムスタンプが表示されます。
これらの数値は、実行するタイミングによって異なります。詳しくは、Lesson-2をご覧下さい。

④ メッセージボックスを「OK」で閉じると、前回同様、レース詳細情報のうち「開催年、開催月日、競馬場コード、開催回、開催日、レース番号、競走名略称10文字」が表示されます。
JV-Dataのダウンロード進捗状況や読み込み進捗状況は上下のプログレスバーで確認することができます。

[ ワンポイントメモ ]
Lesson-2を参考にダウンロードすべきファイルが「cache」フォルダに存在する場合と存在しない場合で、プログレスバーの動きの違いを比べてみましょう。

「いいね!」 1