
Queued Message Handler (QMH) のテンプレートを使っていて、次のことを気にしたことはありませんか?

Enqueue Message.viにメッセージデータを入れると強制ドットがつきます。強制ドットとは、本来は入力データの型があっていない場合でも適当な型に変換することでコンパイルできる場合に型を変換するときに発生する赤い点です(赤はデフォルト設定での色。オプションで色の変更ができます)。強制ドットによって型変換を忘れても問題なく処理できる可能性がありますが、開発者が期待する型に変換するとは限らないので、強制ドットに頼らずに型変換関数で変換することをNational Instrument (NI)は推奨しています。実際に、VI AnalyzerというVIの静的コードレビューツールでも強制ドットの数が一定個数(デフォルト設定だと確か5個)以上あると、強制ドットを減らすようにありがたいアドバイスを受けます。しかし、QMHのテンプレートでは、Enqueue Message.viの入力に対して特に強制ドットの対応をしていません。公式がいいのか…それで?と思う人もいるかもしれません。…大半の人は気にしないのかな?とは思いますが、私は気になりました。今回は、この強制ドットをなくす方法を検討したいと思います。
簡単な方法
強制ドットを発生させない一番簡単な方法は、Enquene Message.viにメッセージデータを入れる直前にバリアントに変換関数を入れるものです。

バリアントに変換関数は、関数パレットのVariantのところにあります。

…まあ、これだけです。全部のEnqueue Message.viでデータを入れるときにバリアントに変換関数を使えばいいですが、まあ面倒です。なので、バリアントに変換関数を毎回使わなくてもいいような方法を考えたいと思います。
Enqueue Message.viを改造する
Enqueue Message.viを改造する場合、次の条件を満たす必要があります。
- Message Dataには任意の型を受け付ける。
- 任意の型のMessage Dataを入れても強制ドットを発生させない。
入力に任意の型を許容するには、Malleable VI (順応性VI) にする必要があります。今回はこのようなMalleable VIを作りました。





Malleable VIを利用することにより、Message Dataは任意の型を受け付けるようになり、VI内でバリアントに変換することで強制ドットの発生を防いでいます。
使い方の例1

使い方の例2

メッセージ:いにデータ:eを送信
このMalleable VIでは次のエンキュー処理に対応できます。
- 1つのメッセージキューに1つのメッセージ+データをエンキュー
- 1つのメッセージキューに複数のメッセージ+データをエンキュー
- 複数のメッセージキューに1つの同じメッセージ+データをエンキュー
複数のメッセージキューにそれぞれ異なるメッセージ+データというパターンは非対応です。あと、2のケースでは複数の配列データというパターンは考慮していません。データとして配列を使用する場合はVIの外で配列をバリアントに変換→それを1次元配列にするという処理を外でやった方がいいかもしれません。配列が1つのメッセージデータなのかメッセージデータの集合なのか、これは場合によるので対応できないですね。でも、Enqueue Message.viをMalleable VIにすることで、強制ドットをなくすことができます。
まとめ
今回はMessage Enqueueのときの強制ドットをなくす方法を検討しました。気にならない人は気にしなくてもいいと思いますが、私は気になってしまったのでなくす方法を検討したという感じです。VI Analyzerに指摘されたくない場合に参考になれば幸いです。
Github
