Вызов функции вызывает зависание программы на C++, если в отладчике нет пошагового выполнения
У меня есть эта короткая программа C++, которая берет снимки с камеры в цикле и отображает их:
void GenericPGRTest::execute()
{
// connect camera
Camera *cam = Camera::Connect();
// query resolution and create view window
const Resolution res = cam->GetResolution();
cv::namedWindow("View");
c = 0;
// keep taking snapshots until escape hit
while (c != 27)
{
const uchar *buf = cam->SnapshotMono();
// create image from buffer and display it
cv::Mat image(res.height, res.width, CV_8UC1, (void*)buf);
cv::imshow("Camera", image);
c = cv::waitKey(1000);
}
}
При этом используется класс (Camera) для управления камерой, созданный мной с использованием Point Grey SDK, и функции из библиотеки OpenCV для отображения изображений. Я не обязательно ищу ответы, относящиеся к использованию любой из этих библиотек, но скорее представляю, как отладить причудливую проблему в целом. Проблема в том, что приложение зависает (не падает) в строке cam->SnapshotMono(). Конечно, я пробежал эту функцию с помощью отладчика. Вот содержимое:
const uchar* Camera::SnapshotMono()
{
cam_.StartCapture();
// get a frame
Image image;
cam_.RetrieveBuffer(&image);
cam_.StopCapture();
grey_buffer_.DeepCopy(&image);
return grey_buffer_.GetData();
}
Теперь каждый раз, когда я перехожу через функцию в отладчике, все работает нормально. Но в первый раз я делаю "шаг за шагом" вместо "шага в" SnapshotMono (), bam, программа зависает. Когда я делаю паузу в это время, я замечаю, что он застрял внутри SnapshotMono () в строке RetrieveBuffer(). Я знаю, что это блокирующий вызов, поэтому теоретически он может зависнуть (не знаю почему, но это возможно), но почему он блокируется при нормальной работе, а не при отладке? Это один из самых странных видов поведения при отладке, который я видел до сих пор. Есть идеи, почему это могло произойти?
Для тех, кто знаком с FlyCapture, приведенный выше код не ломается как есть, а только когда я использую StartCapture() в режиме обратного вызова, а затем завершаю его с помощью StopCapture() перед ним.
Скомпилировано с MSVC2010, OpenCV 2.4.5 и PGR FlyCapture 2.4R10.
1 ответ
Дикое предположение... но может быть так StartCapture
уже запускает процесс, который заканчивается наличием буфера в ìmage
и если вы сделаете шаг, оставьте это на некоторое время, пока не доберетесь до RetrieveBuffer
, Это не тот случай, если вы запустите все сразу...