Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在ROS节点中启动线程不会';没有ROS_警告,我不能工作 玫瑰靛蓝配Ubuntu14.04_C++_Multithreading_Ros - Fatal编程技术网

C++ 在ROS节点中启动线程不会';没有ROS_警告,我不能工作 玫瑰靛蓝配Ubuntu14.04

C++ 在ROS节点中启动线程不会';没有ROS_警告,我不能工作 玫瑰靛蓝配Ubuntu14.04,c++,multithreading,ros,C++,Multithreading,Ros,我现在正在编写一个ros程序,并尝试在ros节点中启动一个线程, 在main函数中,我使用 std::thread my_进程{process} 奇怪的是,如果我在一开始添加一个ROS_WARN或cout,一切都正常,如果我对该行进行注释,则找不到其他输出(cout或cv::imshow)。 我不确定是什么导致了这个问题,是进程完全移到后台,还是只是没有执行?有人能帮忙吗 我的代码如下所示 void process() { while (true) { i

我现在正在编写一个ros程序,并尝试在ros节点中启动一个线程, 在main函数中,我使用
std::thread my_进程{process}
奇怪的是,如果我在一开始添加一个ROS_WARN或cout,一切都正常,如果我对该行进行注释,则找不到其他输出(cout或cv::imshow)。
我不确定是什么导致了这个问题,是进程完全移到后台,还是只是没有执行?有人能帮忙吗

我的代码如下所示

void process() {
        while (true) {
            if (raw_image_buf.empty() || depth_image_buf.empty())  {
               ROS_WARN("Loop skipped");
               // std::cout << "\nLOOP SKIPPED\n";
            } else {
               ROS_WARN("Thread loop");
               cv::Mat raw_img, depth_img;
               ri_buf.lock();

               if (!raw_image_buf.empty()) {
                  raw_img = raw_image_buf.front().first;
                  rawstamp = raw_image_buf.front().second;
                  cv::imshow("raw", raw_img);
                  raw_image_buf.pop();
               }
               ri_buf.unlock();
               di_buf.lock();
               if (!depth_image_buf.empty()) {
                 depth_img = depth_image_buf.front().first;
                 depthstamp = depth_image_buf.front().second;
                 cv::imshow("depth", depth_img);
                 depth_image_buf.pop();
               }
               di_buf.unlock();
            }
       }
}

int main(int argc, char **argv) {
     ros::init(argc,argv, "mynode");
     ros::NodeHandle n("~");
     ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, 
            ros::console::levels::Info);
     ros::Subscriber sub_raw_img = n.subscribe("image_raw", 100, 
            raw_img_callback);
     ros::Subscriber sub_depth_img = n.subscribe("image_depth", 100, 
            depth_img_callback);
     std::thread estimation_process{process};
     ros::spin();
     return 0;
}
void进程(){
while(true){
if(原始图像为空()| |深度图像为空()){
ROS_警告(“跳过循环”);

//std::你能不能编辑这篇文章,把所有相关的代码都以文本形式包含进来?@mikkola谢谢你的提醒:)我希望做某事的时候确实包括睡眠,否则线程永远不会停止,如果速度足够快,什么都不会出现……你能在代码中包含做某事的确切内容吗@Vtik谢谢你的回复ent!在这个循环中,我只从相应的队列中得到两个图像。我的代码被更新。不确定你的代码有什么问题。我尝试运行完全相同的东西,定义了全局变量和回调,没有任何ROS_警告,这对我有效。从cout跳过的循环显示,发布到主题的图像显示为ll(当然是在添加cv::waitKey(1)之后)。如果你需要任何帮助,请随时pm我。你可以编辑帖子,将所有相关代码以文本形式包含在帖子中吗?@mikkola谢谢你的提醒:)我希望“做某事”确实包括睡眠,否则线程将永远不会停止,如果速度足够快,将不会出现任何问题……你能在代码中包含内部发生的事情吗th.@Vtik感谢您的评论!在该循环中,我只从相应的队列中获得两个图像。我的代码已更新。不确定您的代码有何问题。我尝试运行完全相同的操作,定义了全局变量和回调,没有任何ROS_警告,对我有效。从cout跳过的循环显示,图像发布主题的d也会显示出来(当然是在添加了cv::waitKey(1)之后)。如果您需要任何帮助,请随时pm我。