【質問】
タスク内でループを使用して繰り返し処理を行う部分があるが、そのループ内で一定時間を超えた場合に
処理を中断して停止するか、通知を送るなど、別の処理を行うようにしたい。(=タスク全体の処理時間ではなく、そのループにおける処理時間のみで判断したい)
理由としては、タスクタイムアウトの場合はタスク全体での処理時間でしか判断できず、なおかつタスクを外から強制終了する形になるので
開いたままにしておきたくないアプリケーション等がそのままになったり、処理中のファイルが保存されないままになってしまうためである。
【回答】
タスク内の一定期間における時間計測ならば、「タイマー」アクションを使用することで経過時間を計測することが可能です。
具体的には・・・
1. 該当処理を開始するタイミングで「タイマー - 開始」アクションを実行して計測を開始
2. 処理の途中(チェックポイント)にて「タイマー - 読取り」アクションを実行し、経過時間を変数に格納
3. 2の結果の変数値が一定値を超えていた場合に、処理を停止するなどの別の処理に移行する
といった形になります。
以下、一例です。
ループ部分の処理時間が30秒をオーバーした場合には、タスクをユーザーエラーで終了させる例です。
(本来の処理であれば、ユーザーエラーにする前に処理結果を保存する等、様々な対処が可能です)
<AMVARIABLE NAME="var_timer" VALUE="" DESCRIPTION="タイマー経過時間" />
<AMSHOWDIALOG COUNTDOWNDELAY="5">処理Aを開始します
このサンプルでは以降のダイアログに手動応答し即座に閉じれば処理が正常終了しますが
放置していると時間オーバーで異常終了します。</AMSHOWDIALOG>
<AMTIMER SESSION="TimerSession1" />
<AMLOOP FROM="1" TO="10" />
<AMSHOWDIALOG COUNTDOWNDELAY="5">チェックポイント
5秒待機中</AMSHOWDIALOG>
<AMTIMER ACTIVITY="read" RESULTVARIABLE="var_timer" SESSION="TimerSession1" />
<!--タイマーの結果は小数点も含むため、小数点以下を切り捨てた結果を参照して比較する-->
<AMIF EXPRESSION="%Int(var_timer)% >= 30" />
<AMTIMER ACTIVITY="stop" RESULTVARIABLE="var_timer" SESSION="TimerSession1" />
<AMSHOWDIALOG MESSAGE="30秒以上経過したのでタスクを停止します" COUNTDOWNDELAY="5" />
<AMTASK ACTIVITY="stop" STATUSTYPE="ERROR" ERRORNUMBER="9999" ERRORTEXT="30秒以上経過しても処理Aが終了しなかった" />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />
<AMSHOWDIALOG MESSAGE="処理Aが終了しました" COUNTDOWNDELAY="5" />
<AMTIMER ACTIVITY="stop" RESULTVARIABLE="var_timer" SESSION="TimerSession1" />