2

.Net 3.5 とOpenCV 1.1を使用してプログラムを作成しています。コンピューターの Web カメラから画像変数を取得する必要がある複数のスレッドがあります。複数のスレッドが同時にカメラにアクセスしようとすると、メモリ違反エラーが発生するという問題があります。PostThreadMessage と GetMessage を使用して変数をスレッドに送信できることはわかっています。PostThreadMessageandを使用して実行中にスレッドに変数を渡す方法のチュートリアルまたは例を教えてもらえますGetMessageか?

両方のワーカー スレッドがカメラから画像を取得する関数を呼び出そうとすると、発生するエラーはメモリ アクセス違反エラーです。1 つのスレッドで他のすべての画像を取得することで、これを回避したいと考えています。それぞれに、カメラがキャプチャした画像を格納する1 つのIplImage変数があります。お役に立てれば。

4

2 に答える 2

2

ここでは、カメラ画像をシリアル方式でコピーし、コピーしたデータ (IplImage) をマルチスレッドで操作することを前提としています。

これを安全に行うには、未知の人が指摘したように、スレッドでアクセスする可能性のあるメモリ (または変数) をロックする必要があります。Windows CRITICAL_SECTIONでこれを行う方法の非常に短い例は次のとおりです。

CRITICAL_SECTION cs;

/* Initialize the critical section -- This must be done before locking */
InitializeCriticalSection(&cs);

...

/* Release system object when all finished -- 
usually at the end of the cleanup code */
DeleteCriticalSection(&cs);

カメラ (または共有不可のリソース) にアクセスするときは、次の 2 行でアクセス対象を囲むだけです。

EnterCriticalSection(&cs);

/* Operate on your shared data */

LeaveCriticalSection(&cs);

コード (例: IplImage* frame = cvQueryFrame(xyz);) をこれらの 2 行で囲むと、衝突が修正されるはずですが、コードをもう少し編成することで解決できるようです..

于 2009-11-03T03:44:38.763 に答える
0

Where are the memory errors occurring? Can you post some more detail? Are they occurring during accesses to your data structures, or to OpenCV ones? If it's the latter, then I am not sure how messaging is going to help. In either case, a little bit of locking around non-thread-safe data structures sounds like enough.

于 2009-10-30T02:48:41.217 に答える