• 8472阅读
  • 7回复

QT 信号的内存泄漏 [复制链接]

上一主题 下一主题
离线ithero_zhou
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-17
最近在用QT做开发,遇到一个问题:我写的是一个串口底层,当串口中有数据时,会往上层应用程序发送一个信号,告诉上层应用可以开始读串口数据,但上层应用对串口数据会要一些时间去处理,这样就造成了,当底层串口有数据时,就发送信号,这样如果发送到串口数据非常频繁时,上层应用来不急处理,信号就在QT的消息队列里存储,这样如果长时间的频繁发送数据时,程序就会死掉,打开资源管理器发现,内存已经快使用完,有没有什么好的办法,来解决QT消息队列这个问题?
离线rqzrqh

只看该作者 1楼 发表于: 2009-09-18
把信号换成自定义的事件
离线yj_yulin

只看该作者 2楼 发表于: 2009-09-18
完全是上层应用程序处理的问题,来了信号处理不了,还在那个地方堵着,
一个串口过来的数据应该不算大的
离线dbzhang800

只看该作者 3楼 发表于: 2009-09-19
楼主可能哪儿进入误区了,可以先参考论坛中其他人的串口例子
离线318065268
只看该作者 4楼 发表于: 2009-09-21
我认为应该是楼主程序中对队列的处理的问题。
应该不至于信号无限多,内存的耗尽可能是队列处理方式的问题。

首先要把串口收发做到一个新的线程中。队列可以做成静态的,或者全局的。
然后可以用一个QByteArray一次读取串口上的所有数据,然后把它入队,入队之后就发送信号,通知处理模块,已经有数据到来,可以从静态的队列中取数据了。
然后处理模块就去取,取之前判断队列是否为空,不为空就取,取的时候才去的是出队销毁的方式,即dequeue()函数,而不能用head()函数,这样队列不会无限长。
采取这种模式就不需要把串口数据作为信号参数发送了。

另外,串口的发送速度不过k/s级的,系统的内存至少几十M,要让串口数据去占据内存产生拥堵,至少需要几十分钟,我认为可能性不大。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线beajisong

只看该作者 5楼 发表于: 2009-09-22
信号如果带有参数,会暂时消耗一定的内存。
但是,作为槽应该快进快出才对
离线seekbone
只看该作者 6楼 发表于: 2010-01-13
mark
离线2nd090215
只看该作者 7楼 发表于: 2010-01-26
关注,,
快速回复
限100 字节
 
上一个 下一个