繁体   English   中英

阻塞执行程序,直到回调函数执行完毕

[英]Block execution program until callback function complete execution

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

从我的 main() 我启动 interface.getImage(); 想要从我们的数据库中获取图像的函数。 当我们接收图像时,回调函数 void InterfaceColliseo::dataReceived (std::shared_ptr data) 开始执行。 但是我有一个问题,我的程序 main() 在我的回调函数执行之前终止?

主程序

int main(){
        InterfaceColliseo interface;
        IMAGE = true;
        interface.getImage();

        // want to block program here
        return 0;
}


回调函数

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);

    }

}

我认为您只能使用 std 中的线程。 当您使用 join 时,主线程将等待被加入的线程完成其工作。

#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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM