Вызов функции вызывает зависание программы на 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, Это не тот случай, если вы запустите все сразу...

Другие вопросы по тегам