首页| 论坛| 消息

回复: 线程内使用emit(),内存泄漏十分严重,哪里出了问题?有源代码
#6 [zhanglyl 01-04 15:25]
把QString str移出死循环,立竿见影!
#7 回 zhanglyl 的帖子 [勤为径也 01-04 16:00]
zhanglyl:把QString str移出死循环,立竿见影! (2018-01-04 15:25) 
老师,不行啊!
内存还是不断增加啊。
#8 回 勤为径也 的帖子 [angelus 01-04 16:14]
这个问题测试过了,其实并不是内存泄漏,而是使用问题

首先你在线程中发送的 emit 信号是一个异步信号, 异步信号在qt 中都是当作 事件处理的,统一加入到事件队列中
qt的事件队列没有加入防错设置,是一个无限增加的队列,因为是异步,所以当入队事件远远大于出队事件时候,就会把队列塞爆炸,
如果你的机器内存可以非常大,那么程序就会过很久才会因为内存溢出崩溃,不然程序很快就会挂掉.

这个时候有两种方法处理, 原理都是给队列时间去释放内存.
1: 不要用while循环这种没有时间差的处理循环,改用定时器,一定时间去发送信号.
2: 在while循环中,发送信号后,休眠线程,根据你机器的处理能力去决定休眠的时间长短,msleep,usleep,sleep

如果你的信号是一个同步信号,那么就不需要关心上边的,因为执行完信号,就会直接调用槽,然后释放.
永远不会有内存溢出问题!
#9 [zhanglyl 01-05 10:23]
非要我贴源码
void MyObject::MyThread()
{
QString str;
while (thread_run) {
str = "内存还在泄漏吗?\r\n";
QThread::msleep(5);
emit sendStr(str);
}
}
内容来自[短消息]
#10 回 zhanglyl 的帖子 [angelus 01-05 10:32]
zhanglyl:非要我贴源码
void MyObject::MyThread()
{
  QString str;
....... (2018-01-05 10:23) 
你可以试试把 线程休眠去掉!

<< 1 2 3 >> (2/3)

回复 发表
主题 版块