Темы, разделяющие ресурсы C ++ - PullRequest
2 голосов
/ 17 марта 2012

В настоящее время в моей программе запущены два потока:

  1. Основной поток - захват изображения с веб-камеры, сохраненного в изображении CVD .Выполняет обработку этого изображения.

  2. Серверный поток - отправляет полные данные изображения, хранящиеся в указанном выше изображении 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

Мой вопрос, это будет подходящим решением?и что мне нужно для того, чтобы реализовать это?т.е. как мне остановить выполнение определенных частей моего кода, в то время как другой поток выполняет часть своего собственного кода.

Дополнительная информация:

  1. Я использую VS2010 C ++
  2. Клиент находится в C #, и есть только 1 клиент.
  3. Я обращаюсь к данным изображения из изображения CVD, используя image [x] [y], который возвращает значение байта, представляющее интенсивностьimage.
  4. Существует функция copyTo (), доступная для изображения CVD.Кажется, сделать копию изображения в памяти, чтобы создать новый объект с теми же данными.Это было бы полезно?
  5. Я не могу запустить программу в режиме отладки, потому что я работаю с существующей кодовой базой без установленного режима отладки.

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Я бы использовал кольцевой буфер, чтобы я мог читать один кадр при записи другого для клиентов, при условии, что вы не хотите удалять кадры.

Посмотрите на http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx информацию о критических разделах Windows.

Наконец, если у вас есть существующий код, почему вы не можете включить отладочную информацию и перестроить? В противном случае вы стреляете в темноте, пытаясь найти причину этого крушения.

0 голосов
/ 17 марта 2012

как остановить выполнение определенных частей моего кода, в то время как другой поток выполняет часть своего кода

Синхронизация будет выполняться самим каналом - если вы вызываете ReadFile() ¹ в вашем клиенте, он приостанавливает выполнение до тех пор, пока через него не поступят некоторые данные.

В MSDN есть примеры реализаций канала сервера и клиента . Это может помочь.

¹ Я имею в виду не перекрывающийся вызов

...