Я создал приложение Qt5 в Visual Studio 2017, у этого приложения есть издатель OpenDDS.Программа собирается успешно, но когда я нажимаю «Начать отладку», приложение запускается и сразу падает.Я получаю следующую ошибку:
Exception thrown at 0x00007FFA77EC9129 in RobotController.exe: Microsoft C++ exception: CORBA::BAD_INV_ORDER at memory location 0x000000238017DA08.
Я также попытался запустить приложение из командной строки, оно запускается и перестает отвечать на запросы.Я выполнил издатель без приложения Qt, и он успешно запускается.Приложение Qt запустится, когда код издателя отсутствует.
//Publisher for Robot Controller
#include "RobotController.h"
#include <QtWidgets/QApplication>
#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 "DirectionTypeSupportImpl.h"
#include <iostream>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
RobotController w;
w.show();
try {
//Initialize DomainParticipantFactory
DDS::DomainParticipantFactory_var dpf =
TheParticipantFactoryWithArgs(argc, argv);
//Create DomainParticipant
DDS::DomainParticipant_var participant =
dpf->create_participant(0, // domain ID
PARTICIPANT_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::NO_STATUS_MASK);
if (!participant) {
std::cerr << "create_participant failed." << std::endl;
return 1;
}
Direction::NewDirTypeSupport_var sbts =
new Direction::NewDirTypeSupportImpl;
if (sbts->register_type(participant, "") != DDS::RETCODE_OK) {
std::cerr << "register_type failed." << std::endl;
return 1;
}
//Obtain type name and create topic, typename is passed
CORBA::String_var type_name = sbts->get_type_name();
DDS::Topic_var topic =
participant->create_topic("Direction",
type_name,
TOPIC_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::NO_STATUS_MASK);
if (!topic) {
std::cerr << "create_topic2 failed." << std::endl;
return 1;
}
//Creation of a publisher
DDS::Publisher_var pub =
participant->create_publisher(PUBLISHER_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::NO_STATUS_MASK);
if (!pub) {
std::cerr << "create_publisher failed." << std::endl;
return 1;
}
//Create the datawriter
DDS::DataWriter_var writer =
pub->create_datawriter(topic,
DATAWRITER_QOS_DEFAULT,
0, // No listener required
OpenDDS::DCPS::NO_STATUS_MASK);
if (!writer) {
std::cerr << "create_datawriter2 failed." << std::endl;
return 1;
}
//Create Position datawwriter
Direction::NewDirDataWriter_var message_writer =
Direction::NewDirDataWriter::_narrow(writer);
if (!message_writer) {
std::cerr << "_narrow failed!." << std::endl;
return 1;
}
//Add Position datareader statuscondition to condition queue
DDS::StatusCondition_var condition2 = writer->get_statuscondition();
condition2->set_enabled_statuses(DDS::PUBLICATION_MATCHED_STATUS);
DDS::WaitSet_var ws = new DDS::WaitSet;
ws->attach_condition(condition2);
while (true) {
DDS::PublicationMatchedStatus matches;
if (writer->get_publication_matched_status(matches) != DDS::RETCODE_OK) {
std::cerr << "get_publication_matched_status failed!, 2" << std::endl;
return 1;
}
if (matches.current_count >= 1) {
break;
}
//create condition
DDS::ConditionSeq conditions;
DDS::Duration_t timeout = { 60, 0 };
if (ws->wait(conditions, timeout) != DDS::RETCODE_OK) {
std::cerr << "wait failed!" << std::endl;
return 1;
}
}
ws->detach_condition(condition2);
DDS::Duration_t timeout = { 30, 0 };
//Message topic 2
Direction::NewDir message;
message.ID = 1;
message.Forward = 1;
message.Backward = 0;
message.Left = 0;
message.Right = 0;
message.Stop = 0;
//Sending the message 10 times
for (int i = 0; i < 10; ++i) {
DDS::ReturnCode_t error = message_writer->write(message, DDS::HANDLE_NIL);
if (error != DDS::RETCODE_OK) {
std::cerr << "message publication failed!" << std::endl;
return 1;
}
}
if (message_writer->wait_for_acknowledgments(timeout) != DDS::RETCODE_OK) {
std::cerr << "wait_for_acknowledgments failed!, Position" << std::endl;
return 1;
}
// Clean-up!
participant->delete_contained_entities();
dpf->delete_participant(participant);
TheServiceParticipant->shutdown();
}
catch (const CORBA::Exception& e) {
e._tao_print_exception("Exception caught in main():");
return -1;
}
return a.exec();
}
Я хочу, чтобы программа запускалась без сбоев и чтобы издатель отправлял сообщения.