对于多线程视频电话程序来说,这是一个不错的结构吗?

时间:2014-04-25 07:03:35

标签: multithreading qt opencv structure

您好我正在制作一个视频录制程序项目,用于录制和重放视频,以及显示延迟的实时视频,以及通过颜色跟踪放置。

该软件在Linux上运行,在4核心的odroid上运行,最初我开始使用多线程作为每个新类的一部分实现的线程。这些线程中的每一个都会处理自己的gui元素。

我后来发现我需要在main / gui线程中显示所有gui元素/视频。早些时候我使用过opencv和boost。但似乎使用Qt可能是一个更好的主意,因为一些代码已经依赖于QT库。我目前是编程新手,不熟悉opencv,qt或threading。

我的问题是:  这是一个相对健全的程序结构,还是我现在计划如何做到这一点本身就存在错误?

主要/ GUI线程

  • 将显示所有视觉效果视频内容
  • 将为 ButtonControl 对象
  • 启动一个主题

ButtonControl

  • 将处理所有按钮输入,控制程序中发生的事情
  • 取决于按下的按钮将开始和结束线程 像:
  • StoreToFile 对象(开始将视频存储到文件中,同时发送 视频流到 GUI线程以显示它实时存储的内容)
  • ReadFromFile 对象(读取当前存储的文件并发送数据 在 GUI线程
  • 中显示它
  • DelayedVideoStream 对象(将视频存储到缓冲区,并显示一个 对过去5秒发生的事情的持续延迟观察)
  • ColorTracking 对象(跟踪图像中颜色位置的位置) )

亲切的问候,谢谢你花时间看我的问题。

TLDR - 是一个将线程实现为类的结构,并且将图像数据发送回gui / main线程,这是一种做多线程程序的好方法吗?

1 个答案:

答案 0 :(得分:1)

在性能方面,最好的方法是根本不直接处理线程,而是使用QtConcurrent::run。绘制QImages是安全的,它只是通过信号传递给GUI对象进行显示。我写了a complete example来证明这种方法。由于相邻的代码相邻,它可以产生一些非常简洁和易于理解的代码。

如果你确实想要使用显式线程,那么不是从QThread派生,而是简单地将各种工作者对象移动到它们的线程中,并让它们通过信号和插槽进行通信将会容易得多。我也有a complete example这种方法。