VIを非同期で呼び出す
- 更新日2025-08-27
- 8分で読める
サブVIノードまたはリファレンス呼び出しノードでターゲットVIを普通に呼び出すと、ターゲットVIが結果を返すまでデータフローはそのノードで停止し、結果を受信した後ノードの出力端子からデータフローが続行します。
これとは対照的に、サブVIを非同期で呼び出すと、呼び出しVIにデータが流れている間にも、呼び出しVIサブVIは実行を開始します。呼び出しVIがサブVIの結果をすぐに必要としない場合に、サブVIを非同期呼び出しすることを推奨します。このような場合は、非同期呼び出しによりサブVIが呼び出しVIと同時に実行されるため、呼び出しVIの実行時間が大幅に短縮されます。以下は、VIの非同期呼び出しにより実行を効率化できるプログラミングシナリオの例です。
- 実行中にサブVIに操作を割り当てる場合
- 同じターゲットVIの複数のインスタンスに1つのタスクを分割して割り当てる場合 (特に、実行時までタスクに必要なインスタンスの数が分からない場合)
- 並列実行をして結果を同時に収集する必要のある複数のVIに制御されるコンポーネントを含む、複雑なユーザインタフェースを起動する場合
VIの非同期呼び出しの構成方法の概要
LabVIEWでは、すべてのVIの非同期呼び出しは次のステップの組み合わせで構成されています。
- 非同期で呼び出すVIリファレンスを準備する―「VIリファレンスを開く」関数でリファレンスを取得し、オプション入力の一部に非同期オプションフラグの1つ (0x80または0x100) を設定して、非同期実行のVIリファレンスを準備します。このステップにより、リソースが非同期呼び出しに割り当てられます。
- VIの非同期呼び出しを開始する―非同期呼び出しを開始ノードにVIリファレンスを配線し、ターゲットVIの実行を開始します。ターゲットVIが実行されている間も、呼び出しVIでデータフローは継続します。
- (オプション) VIの非同期呼び出しの結果を収集する―非同期呼び出しを行うアプリケーションでターゲットVIの出力が必要とされる場合は、VIリファレンスを非同期呼び出しを待機ノードに配線して結果を収集します。非同期呼び出しを待機ノードは、タイムアウトするか、関連付けられたサブVIが実行を終了するまで待機します。
- VIリファレンスを閉じる―「リファレンスを閉じる」関数を使用して、VIリファレンスを使用し終わったことをLabVIEWに伝えます。これにより、関連リソースは開放されます。
VIの非同期呼び出しのタイプ
VIの非同期呼び出しを実行するには、意図する使用ケースが、以下の使用モデルのいずれであるかを判断する必要があります。各モデルの実装方法については次のトピックを参照してください。
同じVIへの複数の呼び出しを非同期で起動し、並列実行するLabVIEWでVIの非同期呼び出しを管理する: 非同期呼び出しプール
通常VIの非同期呼び出しを使用する場合、VIの非同期呼び出しの管理に関する知識は必要ありませんが、非同期呼び出しプールを理解すると、パフォーマンス制御や確定的アプリケーションの設計に役立ちます。「VIリファレンスを開く」関数のオプション入力に非同期オプションフラグの1つを設定して、非同期呼び出しを実行するためのVIリファレンスを準備すると、そのVIのすべての呼び出しデータを追跡記録するデータ領域のプールが作成されます。単一のデータ領域ではなく、データ領域のプールがVIリファレンスに関連付けられるため、同じVIリファレンスで複数の非同期呼び出しを開始できます。非同期呼び出しを開始ノードを使用して、VIリファレンスで非同期呼び出しを開始するたびに、プール内の1つのデータ領域が予約されます。VIが実行を終えると、その出力はデータ領域に保存され、VI呼び出しは完了したものとしてマークされます。非同期呼び出しを待機ノードが呼び出しVIの出力を待機している場合は、データ領域から結果が返され、同じVIの他の呼び出し用のデータ領域が開放されます。
非同期呼び出しプールによるパフォーマンスへの影響
LabVIEWでは、各VIリファレンスに対して、ターゲットコンピュータの各CPUコアにつき1つのデータ領域が非同期呼び出しプールに作成されます。使用可能なデータ領域以上の非同期呼び出しがターゲットVIに対して開始されると、追加のデータ領域をプールに割り当てられ、プールのサイズが拡大されます。領域の割り当てに要する時間は確定的でないため、割り当てをトリガする非同期呼び出しを開始ノードにおいて、VIの呼び出しに予測不可能な遅延が発生する場合があります。
非同期呼び出しを開始ノードで予測不可能な遅延を回避する
リアルタイムオペレーティングシステムで実行する必要のあるVIにおいて、予測不可能な遅延が発生することを防ぐためには、非同期呼び出しを開始する前に非同期呼び出しプールを追加メソッドを呼び出し、使用するVIリファレンスに必要な数のデータ領域を呼び出しプールに事前に割り当てておきます。データ領域を事前に割り当てておくと、遅延はプログラムの最初のみで発生し、非同期呼び出しを開始ノードでは発生しません。
非同期呼び出しプールがパフォーマンスに与える影響の詳細については、labview\examples\Application Control\VI Server\Asynchronous Call By ReferenceディレクトリのPopulating the Asynchronous Call Pool VIを参照してください。関連サンプルを検索
非同期呼び出しプールが同じVIの複数の呼び出しからの出力の収集に与える影響
VIの非同期呼び出しの結果を収集する場合、呼び出されたVIのリファレンスを非同期呼び出しを待機ノードに渡す必要があります。非同期呼び出しを待機ノードが受け取るリファレンスは、VIのリファレンスであり、特定のデータ領域のリファレンスではないため、ノードはリファレンスVIの特定の呼び出しの出力を収集できません。代わりに、ノードは、完了したVI呼び出しの出力を返します。この現象の詳細については、次のブロックダイアグラムを参照してください。
ラベルからも分かるように、複数の非同期呼び出しを待機ノードが同じVIリファレンスに依存している場合、どのノードがそのVIリファレンスの特定の呼び出しの出力を返すかを予測することはできません。前述のダイアグラムでは、上の非同期呼び出しを待機ノードは、非同期呼び出し1を開始に配線されていますが、非同期呼び出し2を開始の出力を返すことができます。同じVIに複数の呼び出しを実行して、非同期呼び出しを開始ノードを特定の非同期呼び出しを待機ノードと組み合わせたい場合は、次の解決法のいずれかを実行します。
- 実行したいすべての非同期呼び出しに対して、ターゲットVIの固有のVIリファレンスを作成します。非同期呼び出しを待機ノードと非同期呼び出しを開始ノードが固有のVIリファレンスを共有すれば、両方のノードに必ずVIの同じインスタンスを参照させることができます。この解決法は、固有のVIリファレンスへの複数の呼び出しからの出力を収集する方法と似ています。
- 固有の番号や文字列を入力として受け取り、同じ識別子を出力として返すように、ターゲットVIを編集します。ターゲットVIを非同期で呼び出した際、特定の非同期呼び出しを開始ノードに渡す識別子と非同期呼び出しを待機ノードが返す識別子を比較します。それらが一致した場合、非同期呼び出しを待機ノードが返した呼び出しを判定できます。