The test signal is not connected anywhere. The crash still happens at the same function after emit which is
// SIGNAL 0
void LidarSub::test(int _t1)
{
void *_a[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
}
// SIGNAL 0
void LidarSub::test(int _t1)
{
void *_a[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
}
To copy to clipboard, switch view to plain text mode
lidarsub.h:
#ifndef LIDARSUB_H
#define LIDARSUB_H
#include "observation.h"
#include <QThread>
#include <QObject>
#include <ace/Log_Msg.h>
#include <dds/DdsDcpsInfrastructureC.h>
#include <dds/DdsDcpsPublicationC.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/WaitSet.h>
#include "dds/DCPS/StaticIncludes.h"
#include "/home/vtt/IDL/idl_lidar/lidarScanTypeSupportImpl.h"
{
Q_OBJECT
signals:
void test(int i);
public:
LidarSub();
int create();
void destroy();
void lidarDataConverter(LidarScan::Observation newObs);
protected:
virtual void run();
private:
DDS::DomainParticipantFactory_var dpf_;
DDS::DomainParticipant_var participant_;
DDS::DataReader_var reader_;
LidarScan::ObservationDataReader_var reader_i_;
int numOfRecObs_;
};
#endif // LIDARSUB_H
#ifndef LIDARSUB_H
#define LIDARSUB_H
#include "observation.h"
#include <QThread>
#include <QObject>
#include <ace/Log_Msg.h>
#include <dds/DdsDcpsInfrastructureC.h>
#include <dds/DdsDcpsPublicationC.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/WaitSet.h>
#include "dds/DCPS/StaticIncludes.h"
#include "/home/vtt/IDL/idl_lidar/lidarScanTypeSupportImpl.h"
class LidarSub: public QThread
{
Q_OBJECT
signals:
void test(int i);
public:
LidarSub();
int create();
void destroy();
void lidarDataConverter(LidarScan::Observation newObs);
protected:
virtual void run();
private:
DDS::DomainParticipantFactory_var dpf_;
DDS::DomainParticipant_var participant_;
DDS::DataReader_var reader_;
LidarScan::ObservationDataReader_var reader_i_;
int numOfRecObs_;
};
#endif // LIDARSUB_H
To copy to clipboard, switch view to plain text mode
lidarsub.cpp:
#include "lidarsub.h"
#include <QDebug>
#include <QThread>
#include <ace/Log_Msg.h>
#include <dds/DdsDcpsInfrastructureC.h>
#include <dds/DdsDcpsPublicationC.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/WaitSet.h>
#include "dds/DCPS/StaticIncludes.h"
#include "/home/vtt/IDL/idl_lidar/lidarScanTypeSupportImpl.h"
#include "/home/vtt/IDL/idl_lidar/DataReaderListenerImpl.h"
using namespace DDS;
using namespace std;
void LidarSub::lidarDataConverter(LidarScan::Observation newObs)
{
int i = 0;
emit test(i); // <- This causes the segmentation fault
}
LidarSub::LidarSub()
{
numOfRecObs_ = 0;
}
int LidarSub::create()
{
// OpenDDS related code that initiates the DDS configuration. Can't publish this part of the code on this forum.
// This should not affect anything else than the DDS communication.
}
void LidarSub::destroy()
{
TheServiceParticipant->shutdown();
}
void LidarSub::run()
{
while (true) {
}
}
#include "lidarsub.h"
#include <QDebug>
#include <QThread>
#include <ace/Log_Msg.h>
#include <dds/DdsDcpsInfrastructureC.h>
#include <dds/DdsDcpsPublicationC.h>
#include <dds/DCPS/Marked_Default_Qos.h>
#include <dds/DCPS/Service_Participant.h>
#include <dds/DCPS/WaitSet.h>
#include "dds/DCPS/StaticIncludes.h"
#include "/home/vtt/IDL/idl_lidar/lidarScanTypeSupportImpl.h"
#include "/home/vtt/IDL/idl_lidar/DataReaderListenerImpl.h"
using namespace DDS;
using namespace std;
void LidarSub::lidarDataConverter(LidarScan::Observation newObs)
{
int i = 0;
emit test(i); // <- This causes the segmentation fault
}
LidarSub::LidarSub()
{
numOfRecObs_ = 0;
}
int LidarSub::create()
{
// OpenDDS related code that initiates the DDS configuration. Can't publish this part of the code on this forum.
// This should not affect anything else than the DDS communication.
}
void LidarSub::destroy()
{
TheServiceParticipant->shutdown();
}
void LidarSub::run()
{
while (true) {
QThread::msleep(10);
}
}
To copy to clipboard, switch view to plain text mode
DataReaderListenerImpl.cpp - function that is called when new data arrives through DDS
handle_ is pointer to the instantiation of LidarSub class
void DataReaderListenerImpl::on_data_available(DDS::DataReader_ptr reader)
{
LidarScan::ObservationDataReader_var reader_i =
LidarScan::ObservationDataReader::_narrow(reader);
if ( !reader_i )
{
ACE_ERROR((LM_ERROR,
ACE_TEXT("ERROR: %N:%l: on_data_available() -")
ACE_TEXT(" _narrow failed!\n")));
ACE_OS::exit(-1);
}
LidarScan::Observation newObs;
DDS::SampleInfo info;
DDS::ReturnCode_t error = reader_i->take_next_sample(newObs, info);
if (error == DDS::RETCODE_OK)
{
if ( info.valid_data )
{
if ( handle_ != NULL )
{
handle_->lidarDataConverter(newObs);
}
}
} else
{
ACE_ERROR((LM_ERROR,
ACE_TEXT("ERROR: %N:%l: on_data_available() -")
ACE_TEXT(" take_next_sample failed!\n")));
}
}
void DataReaderListenerImpl::on_data_available(DDS::DataReader_ptr reader)
{
LidarScan::ObservationDataReader_var reader_i =
LidarScan::ObservationDataReader::_narrow(reader);
if ( !reader_i )
{
ACE_ERROR((LM_ERROR,
ACE_TEXT("ERROR: %N:%l: on_data_available() -")
ACE_TEXT(" _narrow failed!\n")));
ACE_OS::exit(-1);
}
LidarScan::Observation newObs;
DDS::SampleInfo info;
DDS::ReturnCode_t error = reader_i->take_next_sample(newObs, info);
if (error == DDS::RETCODE_OK)
{
if ( info.valid_data )
{
if ( handle_ != NULL )
{
handle_->lidarDataConverter(newObs);
}
}
} else
{
ACE_ERROR((LM_ERROR,
ACE_TEXT("ERROR: %N:%l: on_data_available() -")
ACE_TEXT(" take_next_sample failed!\n")));
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks