SSブログ

構造体を共有メモリを使用しC++からVB.NETへ転送する方法 [VB]

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

image

BmpMem.cpp

image

image

image

main()部

image


VB.NET部

image

image

参考サイト


共有メモリー(C++とVB.Net)間の共有方法 [VB]

アプリケーションの動作速度を早くするため、処理に時間のかかる部分をC++、そしてGUI作成が比較的容易で出来上がりがきれいなVB.NETを利用して設計した。

C++部分の動作ステータスを確認するため共有メモリを導入したのでそのコードを記録する。

C++部

PfaSharedMem.h

image

PfaSharedMem.cpp

image

VB.NET部

関数定義部

image

共有メモリ作成部

image

共有メモリ読込み部

image

共有メモリ破棄部

image

以上


タブのページ数を取得する。 [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ファイルを操作するクラスとなっている。これの内容についてはここでは割愛する。

vb.png 

 

ソースコード


1次、2次元配列のマージソート方法 [VB]

マージソート

クイックソートよりかなり優れたソート方法です。元のデータの並び方が悪いと、クイックソートの効率はバブルソート並みに悪化します。マージソートはそのようなことが無いので効率よくソートを行うことのできるアルゴリズムです。

大まかな名がとしては以下の手順となります。

  1. 全体を2分割
  2. それぞれをさらに2分割
  3. 全てのブロックが1になるまで繰り返す
  4. 分割完了したら、隣同士のブロックを整列しながら併合
  5. さらに隣同士をマージ
  6. 全体が1つになるまで繰り返す

配列のソートアルゴリズムに関しては、いろいろな場所で紹介されている。ただし1次元配列の場合がほとんどで、2次元配列の場合のサンプルコードは見つけられなかった。

そこで1次および2次元配列のマージソートソフトを作成したので、ここに残しておく。

1次元配列のマージソート

image

2次元配列のマージソート

注意: 元となる2次元配列ar(x, y)のyの要素数はソートするデータ要素数に+1しておくこと

image

ソースコード


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

ちょっとしたことだけど、この程度の違いは言語側で吸収してほしいものだ。何かしら理由があるのでしょうけどね!


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。