2016-05-26 3 views
0

Я работаю с ROS и пытаюсь интегрировать Poco Process для управления процессами в ROS QT Interface.запуск фонового процесса с POCO

Вот пример того, что мой узел выглядит так далеко:

void My_Interface::gazebo_launch_world() 
{ 
    std::string command = "roslaunch"; 
    std::vector<std::string> args; 
    args.push_back("robot_gazebo"); 
    args.push_back("robot_gazebo.launch"); 
    PocoProcess pp(command, args); 
    pp.run(); 
} 

int PocoProcess::run() 
{ 
    int rc; 
    try 
    { 
     Poco::Pipe outPipe; 
     Poco::ProcessHandle ph = Poco::Process::launch(command_, args_, 0, &outPipe, 0); 
     rc = ph.id(); 
     Poco::PipeInputStream istr(outPipe); 
     Poco::StreamCopier::copyStream(istr, std::cout); 
    } 
    catch (Poco::SystemException& exc) 
    { 
     std::cout << exc.displayText() << std::endl; 
     return (-1); 
    } 
    return rc; 
} 

Это прекрасно работает (запуск процесса), но проблема в том, что мой интерфейс замерзает во время ожидания завершения процесса, который действительно нежелательно.

Итак, все равно, что я могу запустить процесс POCO в фоновом режиме?

PS: (Безнадежно) Я попробовал даже «&» на векторе args, но это не сработало!

Спасибо,

ответ

1

Ok, решение было отсоединить трубопроводы от выхода, так как он блокирует ожидание, чтобы отобразить его, я изменил свой код следующим образом (только комментирование трубы), и она работала.

void My_Interface::gazebo_launch_world() 
{ 
    std::string command = "roslaunch"; 
    std::vector<std::string> args; 
    args.push_back("robot_gazebo"); 
    args.push_back("robot_gazebo.launch"); 
    PocoProcess pp(command, args); 
    pp.run(); 
} 

int PocoProcess::run() 
{ 
    int rc; 
    try 
    { 
     Poco::ProcessHandle ph = Poco::Process::launch(command_, args_); 
     rc = ph.id(); 
    } 
    catch (Poco::SystemException& exc) 
    { 
     std::cout << exc.displayText() << std::endl; 
     return (-1); 
    } 
    return rc; 
} 

Надеюсь, это поможет кому-то еще!

Смежные вопросы