函数调用导致C ++程序冻结,除非在调试器中逐步执行

时间:2013-08-29 20:46:28

标签: c++ debugging freeze flycapture

我有这个简短的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,程序冻结了。当我暂停时,我注意到它位于 RetrieveBuffer()行的 SnapshotMono()内。我知道这是一个阻塞调用,所以它理论上可以冻结(不知道为什么但它可能),但为什么它在正常运行时阻塞而不是在调试时阻塞?这是迄今为止我见过的最奇怪的调试行为之一。知道为什么会这样吗?

对于那些熟悉FlyCapture的人来说,上面的代码不会破坏,而只是在回调模式下使用 StartCapture()时,然后用 StopCapture()<终止它/ em>在它之前。

使用MSVC2010,OpenCV 2.4.5和PGR FlyCapture 2.4R10进行编译。

1 个答案:

答案 0 :(得分:2)

狂野猜测......但可能是StartCapture已经开始了这个过程 最终将缓冲区放在ìmage中,如果你继续使用,则将其留下一些 到达RetrieveBuffer之前的时间。如果你一次全部运行它就不是这种情况......