请选择 进入手机版 | 继续访问电脑版
快捷导航
1 160

Qt学习篇(三):readyRead误使用

Serial 于 2018-6-5 15:45 发表在 [技术分享] [复制链接]
       这几天做音频时尝试使用readyRead信号,导致程序出错,在这记录一下。
       readyRead信号作为一个信号量,在有数据存在时便会触发;
       用法:connect(xxx, SIGNAL(readyRead),  SLOT(yyy()));    //表示当xxx不为空,则信号成立,触发yyy槽函数
看到这个用法之后,我便尝试使用这个信号,当输入设备中有音频数据时便触发数据编码函数,但是多次尝试后发现信号接收不到(在槽函数中实现打印输出亦是不能)
       了解到connect函数在创建连接后会返回一个bool值,那么尝试打印,发现输出为1,表明连接创建成功,那么只能说明xxx中没有数据无法触发信号,或者是其他什么问题;
        之后在百度时看到了这么一句话
        
别纠结这些英语,反正我是靠词霸翻译的,最后总结出来这个信号之所以没有触发与操作系统也有一定的关系;
         在windows下,系统本身需要一个等待,而在linux下则不需要,所以没有添加等待的语句段的话,在windows下是无法发射信号的。
         那么我们便需要使用WaitForreadyread来添加一个等待,其实就是进行下数据的阻塞,具体怎么用我也没有研究,自行百度吧。
         这里来说一下我使用的办法,可能适用性比较差,但能解决问题就行;
         WaitForreadyread这么一个函数是用来阻塞数据的,那么就意味着我们可以将数据进行阻塞留在缓存区内,在一定的延时后将数据取出,当然为了保证实时性,这个延时要尽可能的小。
         那么接下来就简单了,使用一个延时,然后直接调用编码函数,   因为整个音频采集是出于一个线程中,所以在一定的延时后,xxx不会存在为空的情况,这样就没有不要使用信号来实现了。


此贴仅作为记录使用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 1 个关于本帖的回复 最后回复于 2018-7-11 11:11

Serial 中级会员 发表于 2018-7-11 11:11:04 | 显示全部楼层
之前一直处于一个误区,没有将readyRead信号无法触发与县城联系在一起,实际上我的数据判断位于子线程中,而在QT中继承Qthread类后,在类中定义的对象或或对象的指针都是属于主线程的,,因此导致子线程中的数据判断信号与延时QTimer无法使用。如果在主线程中使用便无误
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-18 20:18