OpenCV Multi-Threading Message Message - PullRequest
       12

OpenCV Multi-Threading Message Message

2 голосов
/ 29 октября 2009

Я пишу программу с использованием .Net 3.5 и OpenCV 1.1 . У меня есть несколько потоков, которым нужно получать переменные изображения с веб-камеры на моем компьютере, проблема в том, что я получаю ошибки нарушения памяти, когда несколько потоков пытаются получить доступ к камере одновременно. Я знаю, что могу использовать PostThreadMessage и GetMessage, чтобы отправить переменную в потоки. Может кто-нибудь дать мне учебное пособие или пример того, как передать переменную потоку, когда он работает, используя PostThreadMessage и GetMessage?

Ошибки, которые я получаю, являются ошибками нарушения доступа к памяти, когда оба моих рабочих потока пытаются вызвать функцию, которая получает изображение с камеры. Я хочу обойти это, имея один поток получить изображения для всех остальных. Каждый из них имеет свою переменную IplImage , которая хранит изображение, снятое камерой. Надеюсь это поможет.

Ответы [ 2 ]

2 голосов
/ 03 ноября 2009

Я собираюсь выйти здесь на конечность и предположить, что вы хотите скопировать изображение с камеры последовательно, а затем работать с скопированными данными (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);

Теперь, когда вы получаете доступ к камере (или любому другому ресурсу с общим доступом), вы просто окружаете объект, к которому получаете доступ, следующими двумя строками:

EnterCriticalSection(&cs);

/* Operate on your shared data */

LeaveCriticalSection(&cs);

Окружение вашего кода (например, IplImage * frame = cvQueryFrame (xyz);) этими двумя строками должно исправить ваши коллизии ... но, похоже, ваш код мог бы помочь с немного большей организацией ..

0 голосов
/ 30 октября 2009

Где происходят ошибки памяти? Можете ли вы опубликовать более подробную информацию? Они происходят во время доступа к вашим структурам данных или к OpenCV? Если это последнее, то я не уверен, как обмен сообщениями поможет. В любом случае, небольшая блокировка вокруг не поточно-безопасных структур данных звучит как достаточно.

...