博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QThread线程注意事项
阅读量:4300 次
发布时间:2019-05-27

本文共 733 字,大约阅读时间需要 2 分钟。

class Thread:public QThread

{
     Q_OBJECT
protected:
     void run();
}
void Thread::run()
{
   *******
   do something......
  *******
}
Thread* t=new Thread();
connect(t,SIGNAL(finished()),t,SLOT(deleteLater()));
t->start();

有几点,是必须注意的,否则造成,finished()信号永远不会被响应,deleteLater()永远不会被执行,那么t永远不会被析构,从而造成内存泄露:

1、确保开启子线程的那个父线程,进入exec()消息循环状态!
由于某些原因,父线程如果不能进入exec()消息循环,那么,finished()是不可能被响应的,那么,deleteLater()也就不会被执行。
因此,必须注意你的父线程,在开启子线程后,有没有再次进入exec()。
2、必须注意:t->start()的启动,是否出现异常,如果出现异常,那么,线程并没有被正常启动,那么,就不存在线程的结束,也就不可能有finished()信号的存在,那么,deleteLater()也就不可能被执行,也就是说,t最终没有被析构销毁。
什么情况t->start()会出现异常?举个例子:当程序已经开启了过多的线程,那么,再继续启动新的线程,都是无效的,t->start()就会出现异常。
3、父线程先于子线程被销毁,那么,deleteLater()也是不会被执行的。因为,本应执行deleteLater()这个函数的实体线程,已经被销毁,那么,deleteLater()也就不可能被执行。

转载地址:http://xjxws.baihongyu.com/

你可能感兴趣的文章
一句话总结java23种设计模式
查看>>
静态表查找
查看>>
乐观锁的一种实现方式——CAS
查看>>
JAVA线程间通信的几种方式
查看>>
IDEA中怎么新建package包,只有directory选项
查看>>
django admin 增加查看权限
查看>>
django后台加载从15秒优化到1秒的过程小记
查看>>
chrome不显示Django-suit左侧菜单栏
查看>>
Python区间库python-intervals
查看>>
django admin 登录用户名密码错误提示
查看>>
python3 AttributeError: 'function' object has no attribute 'func_name'
查看>>
解决ubuntu下修改my.cnf设置字符集导致mysql无法启动
查看>>
根据进程的PID查询对应端口号
查看>>
Ubuntu安装指定版本的docker
查看>>
MySQL show processlist过滤
查看>>
Python日志logging的levelname格式化参数1.1s小记
查看>>
ubuntu虚拟机VMware桥接模式无法自动化获取IP的解决方法
查看>>
Python debug 报错:SystemError: unknown opcode
查看>>
Python将树结构转换成字典形式的多级菜单结构,写入json文件
查看>>
关闭linux防火墙让windows宿主机访问ubuntu虚拟机web服务以及docker
查看>>