使用类的静态指针来实现各模块共用资源共同管理

背景:

     在项目中要使用到工业摄像头,还有一个位移台。我们设计的功能复杂又相互嵌套,每个功能模块要访问摄像头的类。这时该怎么设计呢?

1 .在每个功能中都初始化一个相机的控制类吗,这样的话,相机被反复初始化,反复 打开,这显然是不行的。因为相机打开以后,第二次就打不开了,因为相机已经被占用,不能再打开,就要关闭再打开,可是关闭以后,第一个功能模块就用不了了,要解决这个问题就要每个功能函数 都要有重复的打开关闭的操作,程序很傻。

2. 相机初始化一次,功能模块获取他,不再初始化。 用 extern 修饰  可以跨文件访问  但是这样不利于封装,文件关联性比较强。

为了更好的封装,我们用类的静态指针来共享设备控制接口

GLOBALDATA_H
class GlobalData
{
public:
  static GlobalData* GetInstance();
  GlobalData();
  ~GlobalData();
  DahengController* camera;
  TriaxialController* platform;
private:
  static GlobalData* global_data_;
};

 static GlobalData* GetInstance(); 是一个静态方法
  static GlobalData* global_data_;  是一个私有静态指针

上面的get方法获取获取下面的静态指针,我们使用静态指针来共享各个设备控制接口

cpp

#include "globaldata.h"

GlobalData* GlobalData::global_data_ = nullptr;

GlobalData* GlobalData::GetInstance()
{
  if (global_data_ == nullptr)
    global_data_ = new GlobalData();

  return global_data_;
}

GlobalData::GlobalData() {
  camera = nullptr;
  platform = nullptr;
}

main

void InitSystem() {
  GlobalData* gd = GlobalData::GetInstance();
  QTextCodec *codec = QTextCodec::codecForName("GBK");

  //初始化摄像头库
  gd->camera = new DahengController();
  gd->camera->Init();
  if (!gd->camera->IsOpen()) {
    QMessageBox ::
    critical(NULL, codec->toUnicode("错误!!!!!"), codec->toUnicode("相机设备打不开"), QMessageBox::Yes , QMessageBox::Yes);
    //std::exit(EXIT_FAILURE);
  }
}

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  InitSystem();
  MainWindow window;
  window.resize(QGuiApplication::primaryScreen()->size());

  window. show();
  return a.exec();
}

某个相机功能模块(片段)

CameraPanel::CameraPanel(QWidget *parent)
    : QWidget(parent),
      ui(new Ui::CameraPanel),
      image_viewer(new ImageViewer),
      is_camera_opened(false),
      gd(GlobalData::GetInstance()),
      auto_focus_worker(new QObject),
      auto_focus_thread(new QThread)
{
  ui->setupUi(this);

  timer = new QTimer(this);

  auto_focus_worker->moveToThread(auto_focus_thread);


  gd->mapping_area = &mapping_rect;
  gd->image_viewer = image_viewer;

  ui->horizontalLayout_image_viewer->addWidget(image_viewer);

  //注册回调
  gd->camera->RegisterCaptureCallback([this](cv::Mat mat) {
    static int index = 0;

    //图片产生太快 无法及时消费时 就不向list里面放入新图片
    if (image_show_list_.size() < 3) {
      image_show_list_.push_back(mat);
      emit GetImage();
    }

    //只有上一次检查对焦执行结束后才开始下一次
    if (!auto_focus_thread->isRunning() && is_auto_focus) {
      mat = mat(cv::Rect(mat.cols/2 - 250, mat.rows/2 - 250, 500, 500));
      image_auto_focus_list_.push_back(mat);
      auto_focus_thread->start();
    }

    frame_rate_of_acquisition++;
    index++;
    if (index >= MAXINT32) {
      index = 0;
    }
  });
}

我们在相机的某个功能对应的类中定义一个 

GlobalData* gd;初始化为 GlobalData::GetInstance() 就可以共享一个 camera 了
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值