Съобщение за многонишкова нишка на OpenCV

Пиша програма с помощта на .Net 3.5 и OpenCV 1.1. Имам множество нишки, които трябва да получат променливи за изображение от уеб камерата на моя компютър, като проблемът е, че получавам грешки при нарушение на паметта, когато няколко нишки се опитват да получат достъп до камерата едновременно. Знам, че мога да използвам PostThreadMessage и GetMessage, за да изпратя променлива към нишките. Може ли някой да ми даде урок или пример за това как да предам променлива на нишка, докато тя работи с помощта на PostThreadMessage и GetMessage?

Грешките, които получавам, са грешки при нарушаване на достъпа до паметта, когато и двете ми работни нишки се опитват да извикат функция, която получава изображение от камерата. Искам да заобиколя това, като накарам една нишка да получава изображенията за всички останали. Всеки от тях има своя променлива IplImage, която съхранява изображението, заснето от камерата. Надявам се това да помогне.


person kman99    schedule 29.10.2009    source източник


Отговори (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);

Сега, когато осъществявате достъп до камерата (или всеки ресурс, който не може да се споделя), просто ограждате нещото, до което осъществявате достъп, със следните два реда:

EnterCriticalSection(&cs);

/* Operate on your shared data */

LeaveCriticalSection(&cs);

Заобикалянето на вашия код (напр. IplImage* frame = cvQueryFrame(xyz);) с тези два реда трябва да поправи сблъсъците ви... но изглежда, че вашият код може да се справи с малко повече организация..

person Rooke    schedule 03.11.2009

Къде възникват грешките в паметта? Можете ли да публикувате малко повече подробности? Възникват ли по време на достъп до вашите структури от данни или до OpenCV? Ако е последното, тогава не съм сигурен как съобщенията ще помогнат. И в двата случая малко заключване около структури от данни, които не са безопасни за нишки, звучи достатъчно.

person spurserh    schedule 30.10.2009