• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

ROS 应用开发(一):c++类方法内线程创建,调用类方法作为线程调用函数

人工智能 bbtang5568 1262次浏览 0个评论

背景: 有一些状态需要实时监控,因此需要新建一个线程来处理此事,为了方便维护,线程的调用函数使用线程创建所在类的类方法。   解决方案: 通过线程创建函数pthread_create实现,函数原型如下:  

//参数依次是:           创建的线程id,       线程属性参数,               调用的函数地址,   传入的函数参数
int pthread_create (pthread_t * tidp,  const pthread_attr_t * attr,  void * (*start_rtn)(void*),  void *arg)

  点1:使用类方法作为线程的调用函数时,需要将类方法声明为静态方法:  

static void* cartesianPose_operate_monitor(void* args);

  点2:静态类方法中使用类成员变量时,一种方式是将成员变量同样声明为静态,但这样处理会给类成员变量的使用带来很大的不便,另一种方式是通过传递函数参数(即pthread_create 的第四个参数void *arg)实现,本文介绍的即是该方法。   具体实现函数:  

//参数依次是:创建的线程id,线程属性参数,调用的函数地址,传入的函数参数
  int ret1 = pthread_create(&tids1_, NULL,  cartesianPose_operate_monitor, this); //this是重点

  从上述函数实现可看到,第四个参数为当前的类对象指针this,通过该指针可以实现在类方法cartesianPose_operate_monitor中使用非静态类成员变量,具体实现如下:  

//类定义
class classA {
public:
	classA (int argc, char** argv);
	~classA ();
private:
  static void* cartesianPose_operate_monitor(void* args); //**point1**:声明为静态方法
private:
  pthread_t  tids1_;
  bool xDecPressed_; //**point2**:声明为非静态bool
};


void* classA ::cartesianPose_operate_monitor(void* args)
 {
   classA * my_class = (classA *) args; //**point3**:将void*入参转为类对象classA* 指针
   ros::Rate s_timer(ROS_LOOP_RATE); // 定时器
   while(1)
   {
     s_timer.sleep();
     if (my_class->xDecPressed_) //**point4**:通过类对象指针,使用非静态类成员变量
     {
       std::cout << "say hello" << std::endl;
     }
   }
 }

classA ::classA (int argc, char** argv)
    :xDecPressed_(false)
{
  //参数依次是:创建的线程id,线程属性参数,调用的函数地址,传入的函数参数
  int ret1 = pthread_create(&tids1_, NULL,  cartesianPose_operate_monitor, this); //**point5**:线程创建,函数参数为this
}

  通过以上步骤可以实现类创建类方法作为线程调用函数静态类方法中使用非静态类成员变量等操作。  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ROS 应用开发(一):c++类方法内线程创建,调用类方法作为线程调用函数
喜欢 (0)

您必须 登录 才能发表评论!

加载中……