C++ 阻止执行程序,直到回调函数完成执行

C++ 阻止执行程序,直到回调函数完成执行,c++,qt,C++,Qt,如何阻止程序执行直到回调函数完成执行 从主界面启动interface.getImage;希望从我们的数据库中获取图像的函数。当我们收到图像时,回调函数void InterfaceColliseo::dataReceived std::shared_ptr data开始执行。 但是我有一个问题,我的主程序在回调函数执行之前终止了吗 main.cpp 回调函数 我认为您可以使用std中的线程。当您使用join时,主线程将等待join线程完成其工作 #include <thread> /

如何阻止程序执行直到回调函数完成执行

从主界面启动interface.getImage;希望从我们的数据库中获取图像的函数。当我们收到图像时,回调函数void InterfaceColliseo::dataReceived std::shared_ptr data开始执行。 但是我有一个问题,我的主程序在回调函数执行之前终止了吗

main.cpp

回调函数


我认为您可以使用std中的线程。当您使用join时,主线程将等待join线程完成其工作

#include <thread>

//in main
std::thread myThread(interface.getImage);
myThread.join();

这不会有什么帮助,myThread将在调用interface.getImage后完成其工作,而interface.getImage没有阻塞。@Annyo好的,您可能是对的!我不知道getImage实现是什么方法,也不知道接收数据的方式和位置called@Raffallo我喜欢在回调完成之前阻止执行,而不是interface.getImage函数。我使用条件变量extern std::mutex mtx;外部标准::条件变量cv;dataReceived是一个回调函数,在从数据库恢复图像后调用。@Kamel GH您能给我们提供InterfaceColliseo的代码吗?如果此代码提供了一个自我回答,请提供一些文本和解释。如果这是您的问题的额外公开代码,请回答问题。对我来说,这似乎是太多的代码,无法作为一个工具。当然有可能把它减少到绝对必要的最低限度,以再现您的问题,这可能有助于提高对您的问题的更多关注。
void InterfaceColliseo::dataReceived (std::shared_ptr<IData> data)
{
    if (!data->isValid())
        return;

    const unsigned char* twoDImageData = data->get2DImageData();
    int width2DImageData = data->getWidth2DImageData();
    int height2DImageData = data->getHeight2DImageData();
    const unsigned char* disparityData = data->getDisparityData();
    int widthDisparityData = data->getWidthDisparityData();
    int heightDisparityData = data->getHeightDisparityData();

    if(IMAGE) {
        saveImage(twoDImageData, width2DImageData, height2DImageData,
                  disparityData, widthDisparityData, heightDisparityData);
        IMAGE = false;
    }

    if(ACQUISATION){
        QList<GstObservationBasic> detectorData = data->getObstaclesData();
        getObstacles(detectorData);

    }

}
#include <thread>

//in main
std::thread myThread(interface.getImage);
myThread.join();
#include "interface_colliseo.h"

std::mutex mtx;
std::condition_variable cv;


bool IMAGE;
bool ACQUISATION;

InterfaceColliseo::InterfaceColliseo(){
}

void InterfaceColliseo::startStreaming(){
    dataReceiver = _device->getDataReceiver();
    start();

}

void InterfaceColliseo::getImage(){
    dataReceiver = _device->getDataReceiver();
    start();
}

InterfaceColliseo::InterfaceColliseo(QString IP): _IP(IP) {
    qDebug() << "INDUS-5: IP server: " << _IP;
    qDebug() << "INDUS-5: Connecting to sensor...";
    _colliseoClient.setIPServer(_IP);

}

bool InterfaceColliseo::connect2UT(){
    QString path = qApp->applicationDirPath()+"/Configuration.ini";
    QSettings config(path, QSettings::IniFormat);
    _IP = config.value("Connection/IP","10.0.3.144").toString();

    _colliseoClient.setIPServer(_IP);
    _device = _colliseoClient.getDevice();
    _device->connectSensor();
    bool connect = _device->isConnected();
    return connect;
}

QString InterfaceColliseo::sensorName(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getOrderNumber();
}

QString InterfaceColliseo::sensorFirmwareVersion(){
    return _device->getDeviceDiagnostics()->getOperatingData()
           ->getDeviceInformation()->getFirmwareVersion();
}

QString InterfaceColliseo::getSensorHeadPN(QString sensor){
     return _device->getDeviceDiagnostics()->getOperatingData()
             ->getDeviceInformation()->getSensorHeadPN(sensor);
}

QString InterfaceColliseo::getEvaluationUnitSN(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEvaluationUnitSN();
}

QString InterfaceColliseo::getEvaluationUnitPN(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEvaluationUnitPN();
}

QString InterfaceColliseo::getEvaluationUnitFirmwareVersion(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEvaluationUnitFirmwareVersion();

}

QString InterfaceColliseo::getEstimatedAngleX(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEstimatedAngleX();

}

QString InterfaceColliseo::getEstimatedAngleZ(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEstimatedAngleZ();

}

QString InterfaceColliseo::getEstimatedHeight(){
    return _device->getDeviceDiagnostics()->getOperatingData()
            ->getDeviceInformation()->getEstimatedHeight();

}

void InterfaceColliseo::saveImage(const unsigned char*twoDImageData,
                                  int width2DImageData, int height2DImageData,
                                  const unsigned char*disparityData,
                                  int widthDisparityData, int disptHeight){
    Configuration configuration;

    QString logFolder = configuration.getLogFolder();

    QImage imgRight(twoDImageData, width2DImageData, height2DImageData, QImage::Format_Indexed8);
    QImage imgDisparity(disparityData, widthDisparityData, disptHeight, QImage::Format_Indexed8);

    QPixmap imgRght = QPixmap::fromImage(imgRight);
    QPixmap imgDisp = QPixmap::fromImage(imgDisparity);

    QString rghtImgPath = logFolder + "raw_image.png";
    QString dispImgPath = logFolder + "disp_image.png";

    imgRght.save(rghtImgPath, "PNG");
    imgDisp.save(dispImgPath, "PNG");

}


void InterfaceColliseo::getObstacles(QList<GstObservationBasic> detectorData){

    if (detectorData.size() == 0)
    {
        qDebug() << "Obstacles: no detected obstacles.";
        return;
    }

    Configuration config;
    config.writeLog("***************Obstacles List Acquisation******************");
    Q_FOREACH(const GstObservationBasic &obs, detectorData)
    {

        qDebug() << "Obstacles: " << gstObservationToString(obs);
        config.writeLog(gstObservationToString(obs));
    }
}


void InterfaceColliseo::dataReceived (std::shared_ptr<IData> data)
{
    if (!data->isValid())
        return;

    const unsigned char* twoDImageData = data->get2DImageData();
    int width2DImageData = data->getWidth2DImageData();
    int height2DImageData = data->getHeight2DImageData();
    const unsigned char* disparityData = data->getDisparityData();
    int widthDisparityData = data->getWidthDisparityData();
    int heightDisparityData = data->getHeightDisparityData();

    if(IMAGE) {
        saveImage(twoDImageData, width2DImageData, height2DImageData,
                  disparityData, widthDisparityData, heightDisparityData);
        IMAGE = false;
    }

    if(ACQUISATION){
        QList<GstObservationBasic> detectorData = data->getObstaclesData();
        getObstacles(detectorData);
        ACQUISATION = false;

    }

}

void InterfaceColliseo::start() {

    dataReceiver->addListener(this);

    if(dataReceiver->isListening())
        dataReceiver->stopListening();

    dataReceiver->startListening();
    _device->triggerSingleImageAcquisition();
}