並列タスクに優先度を付ける
- 更新日2025-08-27
- 8分で読める
並列タスクは、「待機(ms)」関数を使用したり、VIプロパティダイアログボックスの実行カテゴリの優先度の設定を変更することで、優先度を設定できます。
ほとんどの場合、デフォルトのVIの優先度は変更しないことが望まれます。実行順序を制御するために優先度を使用すると、期待する結果が得られない場合があります。設定を誤ると、優先度が低いタスクが完全に無視される可能性があります。優先度が高いほうのタスクが長期間実行するように設計されている場合、優先度が高いほうのタスクが定期的に待機しない限り、優先度が低いほうのタスクは実行されません。
待機関数を使用する
待機関数を使用して、重要度の低いタスクの実行頻度を少なくすることができます。たとえば、複数の並列ループがあり、そのうちのいくつかを頻繁に実行する場合には、優先度の低いほうのタスクに対して待機関数を使用します。これにより、頻繁に実行されるタスクに、より多くの時間が割り当てられるようになります。通常は、待機関数を使用するだけで十分です。したがって、ファイル»VIプロパティを選択して、VIプロパティダイアログボックスで実行を選択する方法で優先度を変更する必要は特にありません。
「同期ノードとノードブロック」セクションでの説明のように、ブロックダイアグラムが待機する場合、他のタスクが実行できるようコンピュータはそれをキューから削除します。
通常、待機関数はユーザインタフェースをポーリングするループで役に立ちます。100~200 msの待機は短い時間ですが、この待機によってアプリケーションの負荷が軽減され、他のタスクがさらに効率良く処理されます。さらに、待機によってオペレーティングシステムへの負荷も軽減されるため、他のスレッドやアプリケーションの処理に割り当てられる時間が増加します。ブロックダイアグラムの時間をあまり重視しないセクションに待機を追加して、他のタスク用に時間を確保することを検討してください。
「待機 (ms)」関数を使用すると、LabVIEWが指定した時間だけ待機します。「次のミリ秒倍数まで待機」関数を使用すると、LabVIEWはミリ秒カウンタが指定した時間の倍数になるまで待機します。
優先度を変更する
ファイル»VIプロパティを選択して、VIプロパティダイアログボックスで実行を選択する方法でも、VIの優先度を変更することができます。優先度のレベルは、下記のリストから選択できます (優先度の低い順)。
- バックグラウンド (最下位)
- 低(通常)
- 中
- 高
- タイムクリティカル (最上位)
- サブルーチン優先度
上から5つの優先度 (最下位から最上位) は動作が似ていますが、サブルーチンには他にはない特性があります。以下の2つのセクションは、サブルーチンレベルを除くすべての優先度に該当します。
ユーザインタフェース実行システムにおける優先度
マルチスレッド処理アプリケーションのユーザインタフェース実行システムでは、実行システムのキューに複数のエントリポイントがあります。実行システムは、キューにある優先度「高」のVIをそれより優先度の低いVIの前に置きます。優先度「高」のタスクが実行中でそれより優先度の低いタスクしかキューにない場合には、優先度「高」のVIが実行し続けます。たとえば、各レベルの優先度のVIが2つずつ実行キューにある場合、優先度が「最高」のVIは両方が終了するまで排他的に実行時間を共有します。次に、優先度が「高」のVIが、両方が終了するまで排他的に実行時間を共有します。ただし、優先度が「高」のVIが待機する関数を呼び出す場合、実行システムは、その待機やI/Oが完了するまで優先度が高いほうのVIをキューから取り除き、他のタスク (場合によっては優先度の低いほう) を実行に割り当てます。待機またはI/Oが完了したら、実行システムは保留中のタスクをキューの優先度がそれより低いタスクの前に再び入れます。
また、優先度が「高」のVIがそれより優先度の低いサブVIを呼び出す場合、呼び出しているVIが実行していなくても、そのサブVIは呼び出しているVIの最も高い優先度を譲り受けます。その結果、サブVIの優先度のレベルを上げるために、VIが呼び出すサブVIの優先度のレベルを変更する必要はありません。
他の実行システムとマルチスレッド処理アプリケーションの優先度
「サブルーチン」の優先度とユーザインタフェースの実行システムを除き、実行システムのそれぞれに各優先度レベル用の別の実行システムがあります。優先度が付けられた各実行システムには、独自のキューとそのキューのブロックダイアグラムの処理専用の2つのスレッドがあります。
6つの実行システムの代わりに、優先度に関係なくユーザインタフェースシステムに対して1つ、他のシステムに対して25個 (5つの各優先度レベルに対して5で乗算された5つの実行システム) あります。
オペレーティングシステムは、分類に基づいて、オペレーティングシステムの優先度レベルをこれらの実行システムの各スレッドに割り当てます。したがって、通常の実行では、優先度がより高いタスクは優先度がより低いタスクよりも多くの時間を取得します。ユーザインタフェースの実行システムにおける優先度のように、優先度が高いタスクが定期的に待機しない限り、それより優先度が低いタスクは実行しません。
優先度の低いほうのタスクの優先度レベルを定期的に上げることで、この問題を回避しようとするオペレーティングシステムもあります。これらのオペレーティングシステムでは、優先度「高」のタスクが連続して実行しようとしても、これより優先度の低いタスクには定期的に実行する機会が与えられます。ただし、この動作はオペレーティングシステムによって異なります。中には、タスクのこの動作や優先度を調整できるオペレーティングシステムもあります。
ユーザインタフェース実行システムはシングルスレッドです。ユーザインタフェーススレッドは、他の実行システムの優先度における「低 (通常)」を使用します。このため、優先度「中」の標準実行システムで実行するようVIを設定すると、ユーザインタフェース実行システムが実行しない場合があります。その結果、ユーザインタフェースは動作が低下し、応答しなくなる可能性があります。同様に、VIを優先度「バックグラウンド」で実行するように設定すると、ユーザインタフェース実行システムより低い優先度で実行します。
前述したように、VIがそれより優先度が低いサブVIを呼び出す場合、そのサブVIはその呼び出し中は発呼者と同じ優先度レベルに上げられます。
優先度「サブルーチン」
優先度をサブルーチンにすると、VIははるかに効率良く実行することができます。優先度をサブルーチンに設定したVIは、他のVIと実行時間を共有しません。
サブルーチンの優先度でVIを実行すると、VIはそのVIを中で実行しているスレッドの制御を行い、その発呼者と同じスレッドで実行します。他のVIは、優先度がサブルーチンでも、サブルーチンVIが実行を終了するまでそのスレッド内で実行できません。シングルスレッドのアプリケーションでは、他のVIは実行しません。実行システムでは、サブルーチンを実行するスレッドは他のVIを処理しませんが、実行システムの2つめのスレッドは、他の実行システムと共にVIを実行し続けることができます。
サブルーチンVIの実行は、他のVIと時間を共有せず、サブルーチンが呼び出されたときにフロントパネルの制御器および表示器が更新されないよう合理化されています。サブルーチンVIのフロントパネルはサブルーチンVI実行について何も表示しません。
サブルーチンVIは他のサブルーチンVIを呼び出すことができますが、これ以外の優先度のVIを呼び出すことはできません。簡単な演算を行うサブVIでオーバーヘッドを最小限に抑えるためには、優先度をサブルーチンに指定してください。
また、実行キューと相互に作用するものではないため、サブルーチンはLabVIEWがそれらをキューから削除する原因となる関数を呼び出すことができません。つまり、サブルーチンは、待機関数、GPIB関数、VISA関数、ダイアログボックス関数のいずれも呼び出すことができません。
サブルーチンにはタイムクリティカルのアプリケーションに役立つ機能が追加されています。サブVIを右クリックしてショートカットメニューからビジー状態のサブルーチンの呼び出しをスキップを選択すると、サブルーチンが現在他のスレッドで実行中の場合、実行システムは呼び出しをスキップします。これは、実行システムがサブルーチンが実行する操作を安全にスキップするタイムクリティカルのループで役に立ちます。また、サブVIの完了を待機することで生じる遅延を回避するタイムクリティカルのループでも役立ちます。サブVIの実行をスキップする場合、そのサブVIの出力はすべて、サブVIのフロントパネルにある表示器のデフォルト値になります。