快捷搜索:  汽车  科技

qt添加信号:Qt5.14使用信号与槽实现多线程音YUV数据传输

qt添加信号:Qt5.14使用信号与槽实现多线程音YUV数据传输最后希望分享对大家在实际项目中有些参考作用,最后展示一下实际项目中的效果。USER_VIDEO_INFO info; info.dataY = (uint8_t*)dataY; info.strideY = strideY; info.dataU = (uint8_t*)dataU; info.strideU = strideU; info.dataV = (uint8_t*)dataV; info.strideV = strideV; info.width = width; info.height = height; info.userID = userID; info.sessionID = sessionID; //发送信号及数据 emit SIGNALS_ON_USER_VIDEO_SHOW(info);接收线程中实现接收函数处理业务逻辑 void MainWindow::SLOT

信号和槽机制(singal/slot)是QT的核心机制之一,是一种高级接口,它们被应用于对象之间的通信,它们是Qt的多线程间数据通讯的核心特性。

使用之前,先了解信号槽的四个关键词的作用:(signal - 信号;slot - 槽;emit - 发射信号;connect - 关联信号与槽),其中使用signal 定义信号,slot 定义触发调用槽函数,emit 发送信号,connect 来关联信号槽。

信号和槽通讯分为异步队列和阻塞2种方式进行传输,通过关键字Qt::BlockingQueuedConnection进行申明使用,实例定义如下:

connect(this &MainWindow::SIGNALS_ON_USER_VIDEO_SHOW this &MainWindow::SLOTS_ON_USER_VIDEO_SHOW Qt::BlockingQueuedConnection);

接下来定义YUV数据对象并实现同步发送YUV数据

USER_VIDEO_INFO info; info.dataY = (uint8_t*)dataY; info.strideY = strideY; info.dataU = (uint8_t*)dataU; info.strideU = strideU; info.dataV = (uint8_t*)dataV; info.strideV = strideV; info.width = width; info.height = height; info.userID = userID; info.sessionID = sessionID; //发送信号及数据 emit SIGNALS_ON_USER_VIDEO_SHOW(info);

接收线程中实现接收函数处理业务逻辑

void MainWindow::SLOTS_ON_USER_VIDEO_SHOW(USER_VIDEO_INFO info) { //根据收到的USER_VIDEO_INFO数据按业务逻辑进行处理 }

这是使用QT的信号槽进行YUV视频数据传输的实现方式,在实际方案中可以采用信号槽以及线程锁等机制进行实现,在通过对线程共享数据和信号槽实现对比后,个人更倾向于采用信号槽方式来实现。

实际测试数据传输的耗时来看,信号槽每次传输大概在2-10毫秒完成,按目前流行的1秒15帧的视频展示来算,基本传输 绘制完成后还能有15秒以上的空闲时间,超过时间就得考虑其他环节是否过度消耗CPU造成。

最后希望分享对大家在实际项目中有些参考作用,最后展示一下实际项目中的效果。

qt添加信号:Qt5.14使用信号与槽实现多线程音YUV数据传输(1)

猜您喜欢: