構造体を共有メモリを使用しC++からVB.NETへ転送する方法 [VB]
以下にコードを示す。
C++側ソース
ShareMemクラス
ShareMem.h
ShareMem.cpp
ShareMem.vb
参考サイト
- http://msdn.microsoft.com/ja-jp/library/4ca6d5z7.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
- http://www.hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=10977&reno=10976&oya=10974&mode=msgview&page=$page
cv::Mat 画像データを共有メモリを使用しC++からVB.NETへ転送する方法 [VB]
OpenCVで画像処理を行う部分はWin32 C/C++、GUI部は比較的楽に開発できるVB.NETを使用したかった。そのため画像データを共有メモリ経由でWin32 C/C++ → VB.NETへ転送するコードを書いたが以下の問題のた試行錯誤を繰り返して時間を取られることになった。最終的に成功することが出来たので、コードを残しておく。
試行錯誤した構成
OpenCV cv::MatまたはIplImage画像形式のまま、共有メモリに書き込み、VB.NETでOpenCVを利用できる、OpenCvSharpを導入することで画像を転送する。
C/C++側から共有メモリへ書き込みが出来るが、C/C++、VB.NET共に読み込みできない。調査を進めると、画像データ内のポインタがエラーとなっていた。調べてみるとポインタの実メモリ部は共有メモリには書き込まれていないことが判明。確かに別のアドレス空間から、このポインタを参照してもデータにはアクセスできないですね。
今回の構成
C/C++側でOpenCVデータをビットマップに変換し、そのデータ部を共有メモリに書き込む。ビットマップインフォメーション部の転送は時間がないので今回は考えていない。おいおい「構造体の共有メモリ転送」としてアップします。
以下にコードを示す。
C++側ソース
BmpMemクラス ----------
BmpMem.h
BmpMem.cpp
main()部
VB.NET部
参考サイト
- http://seesaawiki.jp/urakana-tips/d/OpenCV%A4%F2Win32API%A4%C8%C1%C8%A4%DF%B9%E7%A4%EF%A4%BB%A4%C6%BB%C8%A4%A4%A4%BF%A4%A4
- http://buaiso.blogspot.jp/2012/07/boost.html
- http://dobon.net/vb/bbs/log3-31/19304.html
- http://imagingsolution.net/program/opencv/iplimage2bitmap/
共有メモリー(C++とVB.Net)間の共有方法 [VB]
アプリケーションの動作速度を早くするため、処理に時間のかかる部分をC++、そしてGUI作成が比較的容易で出来上がりがきれいなVB.NETを利用して設計した。
C++部分の動作ステータスを確認するため共有メモリを導入したのでそのコードを記録する。
C++部
PfaSharedMem.h
PfaSharedMem.cpp
VB.NET部
関数定義部
共有メモリ作成部
共有メモリ読込み部
共有メモリ破棄部
以上
タブのページ数を取得する。 [VB]
Dim count As Integer
count = System.Windows.Forms.TabControl.tabItem.TabPages.Count
tabItem はタブの名称。初期値は、TagPageX X=ページ番号となる。
使用して欲しくないプロパティを隠匿する方法 [VB]
何らかの理由でダミーデータ等を使用する場合、これを設計者から見えなくする方法。
<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Property Dummy() As Integer
Get
Return 0
End Get
Set(ByVal value As Integer)
ReDims()
End Set
End Property
Sub New(ByVal Dummy As Boolean)
ReDims()
End Sub
これでDummyプロパティは隠匿される。インテリセンスにも表れない。
参考サイト
#If 0 Then の意味 [VB]
#If 0 Then
#end if
常にFalseの意味。この間のコードは実行されない。
逆に必ず実行させるには
#If 1 Then
#end if
と記述すれば常にTrueの意味となる。
TabControlの複数Pageを削除する方法 [VB]
TabControl上の複数のPageを削除する場合、以下のように値の大きなIndexから順に削除する必要がある。値の小さなIndexから削除すると”AugumentOutOfRangeExceptionはハンドルされませんでした。”とランタイムエラーとなる。
tabItem.TabPages.RemoveAt(4)
tabItem.TabPages.RemoveAt(3)
tabItem.TabPages.RemoveAt(1)
Delegateを使用したパラメータ、戻り値のあるマルチスレッド [VB]
VBでマルチスレッドを扱う方法はいくつかあるが、パラメータおよび戻り値を使うことのできるDelegateを使用する方法を今後多く使いそうなので、これの扱い方を残しておく。
’マルチスレッドに渡すFileOperationクラスはネットワーク越しに比較的大きめのCSVファイルを操作するクラスとなっている。これの内容についてはここでは割愛する。
1次、2次元配列のマージソート方法 [VB]
マージソート
クイックソートよりかなり優れたソート方法です。元のデータの並び方が悪いと、クイックソートの効率はバブルソート並みに悪化します。マージソートはそのようなことが無いので効率よくソートを行うことのできるアルゴリズムです。
大まかな名がとしては以下の手順となります。
- 全体を2分割
- それぞれをさらに2分割
- 全てのブロックが1になるまで繰り返す
- 分割完了したら、隣同士のブロックを整列しながら併合
- さらに隣同士をマージ
- 全体が1つになるまで繰り返す
配列のソートアルゴリズムに関しては、いろいろな場所で紹介されている。ただし1次元配列の場合がほとんどで、2次元配列の場合のサンプルコードは見つけられなかった。
そこで1次および2次元配列のマージソートソフトを作成したので、ここに残しておく。
1次元配列のマージソート
2次元配列のマージソート
注意: 元となる2次元配列ar(x, y)のyの要素数はソートするデータ要素数に+1しておくこと
VBオブジェットのnull判定 [VB]
C/C++のつもりで以下のコードを書いたがコンパイルできない。
dim obj as ArrayList
If obj = Nothing Then
Return
End If
いろいろ調べた結果、以下の書式で書くとOKとなることが判明。。。
If obj Is Nothing Then
Return
End If
ちょっとしたことだけど、この程度の違いは言語側で吸収してほしいものだ。何かしら理由があるのでしょうけどね!