0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LabVIEWで.NETのイベントコールバックを使用すると、コールバックVIがロックされてしまう場合の対処法

Last updated at Posted at 2019-12-20

症状

.NETコントロールのイベント処理で、コールバックVIを使用すると、呼び出し元のVIが終了しているにも関わらず、コールバックVIが使用中で編集できなくなります。
イベントコールバックVIを、ライブラリに属させている場合は、ライブラリ全体がロックされてしまうので、とても作業しづらい状態になります。

image.png

image.png

原因と対処法

LabVIEWの既知の問題リストに、リファレンスを閉じた後もコールバックVIを予約したままになることが記載されています。

対処方法には
「コールバックVIのリファレンスを閉じた後、またはコールバックVIを予約解除するために別のVIでインボークノードからGC.Collect()を呼び出します。」
とあります。

新規VIを作成して下記のインボークノードを配置して実行します。

アセンブリ名: mscorlib
オブジェクト名: System.GC
メソッド名: Collect
image.png

このVIを実行すると、コールバックVIのロックが解除されるはずです。

ちなみに、GC.Collect メソッドは強制的にガベージコレクションを実行するメソッドです。

自動化する

ガベージコレクションを実行すれば良いことが分かったので、終了処理に組み込んで自動化します。
実際にやってみると、VIが実行中は、当該の.NETコントロールが使用中のためなのか、開放されませんでした。
VI終了後に、手動で別のVIからガベージコレクションを実行するときちんと開放されます。これはかなりめんどくさいですね。

image.png

少し工夫して、非同期呼び出しで別のVIからガベージコレクションが実行されるようにします。
image.png

結果、手動の場合と同様にロックが解除されましたが、ガベージコレクション実行前にWaitを入れる必要がありました。
開発環境でのみ必要な処理なので、実行時間を気にする必要がありません。
開発環境の場合だけ実行するようにして、十分に長いWaitを設定しておくと良さそうです。

関連情報

LabVIEW 2019 and 2019 SP1 Known Issues
http://www.ni.com/product-documentation/55105/en/

VIを非同期で呼び出す
http://zone.ni.com/reference/ja-XX/help/371361R-0112/lvconcepts/asynchronous_vi_calls/

GC.Collect メソッド
https://docs.microsoft.com/ja-jp/dotnet/api/system.gc.collect?view=netframework-4.8

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?