06-29-2010 09:17 PM
メインの VI でインスタンスを生成したクラスを、SubVI に渡すときの渡し方で、クラスのインスタンスがコピーされて渡されてしまうのでしょうか?
メインVI から SubVI への渡し方で、2種類実装してみました(添付ファイル)
1. SubVI にクラス制御器を作成し、メインVI からインスタンスを渡す
2. SubVI にクラスリファレンスの制御器を作成しインスタンスを格納し、メインVI からクラス制御器のリファレンスを渡す
結論から言いますと、2. のクラスリファレンス制御器経由であれば、正常にリファレンスが渡るようです。
( 確認方法は、SubVI に渡したクラス内の数値をメインVI で変更すると、SubVI 側でも変更される事で確認しました。)
当初 1. で実装をしていて、メインVI での変更が SubVI 側で反映されないため、試行錯誤したあげく 2. で正しい結果を得ることが出来ました。
ここで疑問なのは、通常のプログラミング言語ではクラスのインスタンスを、メソッドや他のクラスに渡す場合「通常はリファレンス(ポインタ)」が渡り、
インスタンスのコピーが渡ることはありません(別途コピーして渡す場合は別ですが)
LabVIEW の場合、デフォルトではSubVI に渡すときはインスタンスのコピーが渡されてしまうのでしょうか。
以上、よろしくお願いいたします。
07-05-2010 01:05 AM
mikiofuku 様
平素より弊社ディスカッションフォーラムをご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ黒須と申します。
①の方法でどの様にメインVIからデータを渡しているのでしょうか?
クラスの制御器を作成してワイヤで直接クラスデータを渡しているということでしょうか?
インスタンスに関してですがLabVIEWはサブVIにした際に、サブVIのフロントパネルが開かれたり、サブVIでフロントパネルを制御するプロパティノードなどが使用されている場合インスタンスのコピーが生成されます。
直接ワイヤの配線を行うことでよりメモリ効率の良いプログラムを作成することが可能です。
メモリに関する詳細な情報はLabVIEWヘルプの基本機能≫パフォーマンスおよびメモリを管理する≫概念をご参照ください。
よろしくお願いいたします。
07-05-2010 02:01 AM
黒須様
こんにちは福島です。
>①の方法でどの様にメインVIからデータを渡しているのでしょうか?
>クラスの制御器を作成してワイヤで直接クラスデータを渡しているという ことでしょうか?
添付していたZIP ファイル(一部誤りがありましたので、再アップしました)の Main.vi 内で、SubVI に対して渡しているところを見て頂けるとお分かりになるかと思います。
左側のプロパティノードで「インスタンスを渡しており」、右側のプロパティノードで「インスタンスが格納されている制御器のリファレンス」を渡しています。
>インスタンスに関してですがLabVIEWはサブVIにした際に、サブVIのフロントパネルが開かれたり、
> サブVIでフロントパネルを制御するプロパティノードなどが使用されている場合インスタンスのコピーが生成 されます。
> 直接ワイヤの配線を行うことでよりメモリ効率の良いプログラムを作成することが可能です。
> メモリに関する詳細な情報はLabVIEWヘルプの基本機能≫パフォーマンスおよびメモリを管理する≫概念 を
> ご参照ください。
まだ見ておりませんでした。ありがとうございます。
添付のように、SubVI に対してワイヤ接続ではなくプロパティノードで渡している理由ですが、
1. 「同一SubVI のフロントパネルを複数・同時に開きたい」
さらに
2. 「開いたSubVI 間は、同じインスタンスのクラスを共有したい」
という要件があるためです。ブロックダイアグラム上に SubVI を配置しワイヤでパラメータを渡す場合、この要件を満たすことが出来ないかと思いますが、いかがでしょうか。
以上、よろしくお願いいたします。
07-05-2010 08:45 PM
mikiofuku 様
お客様の仰るとおり、「同一SubVI のフロントパネルを複数・同時に開きたい」とのことですのでワイヤの配線では下の図のようにVIプロパティの再入実行可能に設定するとインスタンスがコピーされてしまいます。
サブVI間で同じインスタンスのデータを共有したい場合にはリファレンスを使用して直接ポインタからデータを共有していただく必要がございます。
よろしくお願いいたします。