В настоящее время в моей программе запущены два потока:
Основной поток - захват изображения с веб-камеры, сохраненного в изображении CVD .Выполняет обработку этого изображения.
Серверный поток - отправляет полные данные изображения, хранящиеся в указанном выше изображении CVD, своим клиентам, используя именованные каналы.
Когда я запускаю свою программу, она работает очень короткое время, прежде чем падает, за исключением следующего:
0xC000005: Access violation reading location 0x0000000
Я предполагаю, что мой серверный поток пытаетсячтобы получить доступ к изображению одновременно с основным потоком.
Я не занимался параллельным программированием раньше (это мой первый раз), но у меня есть смутное представление о том, как его решить в данный момент.
Мой план состоит в том, чтобы иметь какую-то блокировку, которая препятствует доступу к изображению из основного потока, когда сервер готовится отправить его клиенту.Однако я понял, что может быть проблема, когда серверный поток постоянно хранит ресурс, так как клиент постоянно запрашивает новый кадр.Поэтому я думаю отвечать клиенту только тогда, когда новый кадр извлекается с веб-камеры, чтобы избежать проблемы блокировки, описанной выше.
Подводя итог:
Основной поток:
1. If Image is available
then - Lock image, copy over new data from webcam, release image
else - goto 1
2. Do processing
Сервер:
1. Receive request for new frame from client
2. If (haven't sent the current frame yet)
then - Lock CVD image access, send over frame, release image.
else - wait until new image available.
3. goto 1
Мой вопрос, это будет подходящим решением?и что мне нужно для того, чтобы реализовать это?т.е. как мне остановить выполнение определенных частей моего кода, в то время как другой поток выполняет часть своего собственного кода.
Дополнительная информация:
- Я использую VS2010 C ++
- Клиент находится в C #, и есть только 1 клиент.
- Я обращаюсь к данным изображения из изображения CVD, используя image [x] [y], который возвращает значение байта, представляющее интенсивностьimage.
- Существует функция copyTo (), доступная для изображения CVD.Кажется, сделать копию изображения в памяти, чтобы создать новый объект с теми же данными.Это было бы полезно?
- Я не могу запустить программу в режиме отладки, потому что я работаю с существующей кодовой базой без установленного режима отладки.