C++ 在ROS节点中启动线程不会';没有ROS_警告,我不能工作 玫瑰靛蓝配Ubuntu14.04
我现在正在编写一个ros程序,并尝试在ros节点中启动一个线程, 在main函数中,我使用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
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我。