开发的时候,一定要及时控制CPU使用率以及使用内存大小等三个问题(一个星期检查一次)
一直专注于功能的开发,没注意CPU和内存。昨天无意中发现两个问题:
1. 程序启动后,什么都没干,CPU就50%了(单核)。现在想找原因降低使用率,感觉无从下手,要是平时就注意这个问题就好了。
2. 程序随着功能的运行,内存不断增长。内存泄漏的情况也有,但很少,都是几K几K的增长,这个还不要紧。但是更关键的是,在线程中运行数据的时候,建立了几个超大Map,偏偏写了一句deleteLater即在线程运行完毕之后自动释放内存,同时也会释放这几个超大Map,但是你不知道QT库会何时删除这个线程啊,导致程序内存从20M一下子变成几百M,而且不会降低。我学聪明了,在Map数据不需要以后,就clear,这样不影响后面的逻辑。目前不知道还有没有别的因素需要控制。要开发一个完整的软件还真是不容易。
3. 内存占用大以后,程序反应很慢,可我的机子内存明明有16G之多,为什么还是慢呢?
-----------------------------------------------------------------------------
第一个问题:CPU占用率狂增,已经知道为什么了,因为按钮上的图片在不断的刷新显示,每秒都要读取8次图片资源并刷新。
有错误的代码如下:
void ToolButton::setMousePress(bool mouse_press)
{
this->mouse_press = mouse_press; // 记录状态
if(mouse_press) button_select = true;
else button_select = false;
//qDebug() << "mouse_press=" << mouse_press;
//qDebug() << "button_select=" << button_select;
update(); // UI 按下了就要有反应,所以必须重绘(估计会调用paintEvent函数)
} void ToolButton::paintEvent(QPaintEvent *event)
{
//qDebug() << "button_select=" << button_select;
// UI qqq fixme 怎么在完全不动界面的情况下,也会永远不停的自绘?
QPainter painter(this);
if(mouse_over)
{
//qDebug() << "paintEvent 000 mouse_over";
//绘制鼠标移到按钮上的按钮效果
// UI 点击之后,瞬间就结束了。剩下的时间,都处于按钮的over状态,所以这时必须一直重绘
if(mouse_press) {
QPixmap pixmap;
pixmap.load(pic_name1);
setIcon(pixmap);
if (button_number<=) {
setStyleSheet("color: #3D4A54; background : #C1F1FA;");
}
else setStyleSheet("color: #F5997B;"); // 小按钮变成红色
}
}
else
{
// qDebug() << "paintEvent else";
// 一般情况下
if(button_select)
{
// UI 当按钮被按下以后,这个按钮的mouse_press总是处于true的状态,所以会不停的重绘
// fixme 所有的按钮都是这样吗?效率太低?
// qDebug() << "paintEvent 111 mouse_press";
QPixmap pixmap;
pixmap.load(pic_name1);
setIcon(pixmap);
setStyleSheet("color: #F5997B;"); // 红色,小按钮按下之后的文字前景色
if (button_number<=) setStyleSheet("color: #3D4A54; background : #C1F1FA;");
} else {
// 总是执行
// qDebug() << "paintEvent 222 else";
QPixmap pixmap;
pixmap.load(pic_name);
setIcon(pixmap);
//setStyleSheet("color: #646E76;");
setStyleSheet("color: #3D4A54;"); // 灰色,小按钮取消选中之后的文字前景色
if (button_number<=) setStyleSheet("color: #3D4A54; background : #F4F4F4;");
}
} QToolButton::paintEvent(event);
}
正确的代码如下:
void ToolButton::setMousePress(bool mouse_press)
{
this->mouse_press = mouse_press; // 记录状态
// qDebug() << "mouse_press=" << mouse_press;
if(mouse_press) {
QPixmap pixmap(pic_name1); // UI 红色图片,这里最关键
setIcon(pixmap);
setIconSize(pixmap.size());
if (button_number<=) {
setStyleSheet("color: #3D4A54; background : #C1F1FA;");
}
}
else {
QPixmap pixmap(pic_name);
setIcon(pixmap);
setIconSize(pixmap.size());
if (button_number<=) {
setStyleSheet("color: #3D4A54; background : #F4F4F4;");
}
} // update(); // UI 按下了就要有反应,所以必须重绘(估计会调用paintEvent函数)。但是如果是换图片,就不必重绘了
} void ToolButton::paintEvent(QPaintEvent *event)
{
// Archi exp 曾经造成CPU满格,就是因为不断刷新。其实只要一次性刷新即可
// 必须有条件才能执行函数内容,否则就会永久不间断刷新
// 其实就是我没有理解这个函数,只有需要特殊效果的时候,才在这里画一下。
// 之前8个按钮根据按钮的选择情况,永久不间断刷新。其实一次性设好图片即可,根本不必刷新
// 而且是不断读入图片,并设置QSS,然后更新图像,比单纯使用GDI刷新复杂多了
// 如果不是动态效果,而只是设置图片,根本不必在这里设置。只有某些动态GDI才需要这里设置 QPainter painter(this);
if(mouse_over)
{
// qDebug() << "paintEvent mouse_over"; // UI 鼠标进入按钮区域后,此处只执行一次
// 可在这里绘制一些动态GDI效果,比如:
// painterInfo(0, 100, 150);
}
else
{
// qDebug() << "paintEvent always";
} QToolButton::paintEvent(event);
}
另外可参考的代码如下(一般不执行):
void ToolButton::setMousePress(bool mouse_press)
{
this->mouse_press = mouse_press;
update();
} void ToolButton::paintEvent(QPaintEvent *event)
{
if(mouse_over)
{
//绘制鼠标移到按钮上的按钮效果
painterInfo(, , );
}
else
{
if(mouse_press)
{
painterInfo(, , );
}
} QToolButton::paintEvent(event);
}
-----------------------------------------------------------------------------
第二个问题:
-----------------------------------------------------------------------------
第三个问题:
开发的时候,一定要及时控制CPU使用率以及使用内存大小等三个问题(一个星期检查一次)的更多相关文章
- 生成CPU使用率 sin 曲线 控制cpu使用率 编程之美
入职Oracle 以后想着把之前写过的<编程之美>中控制CPU使用率曲线的程序再写一边, 可是总是由于入职须要学习的东西太多, 没有时间. 程序早就写好了. 最终有机会贴出来了.o(∩∩) ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- python指定cpu使用率,与内存占用率
python指定cpu使用率,与内存占用率 """ runing.py -c 2 -t 0.01 -m 1000 -c cpu核数,不加-c参数为最大核数 -t cpu运 ...
- python控制cpu使用率
以下亲测可行. 使用方法:命令行模式 runing.py -c 2 -t 0.01 -c 指定cpu核数:不指定-c参数默认为所有核数. -t 数值越大,cpu使用率越低. runing.py &qu ...
- Linux 控制CPU使用率
曾经看过<编程之美>上提到说使 CPU的使用率固定在百分之多少.然后这次刚好要用到这个东西,下面是一个简单的实现.基于多线程: Linux 版本: #include <iostrea ...
- CPU使用率和平均负载
转载: https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487782&idx=3&sn=3f04bb053d ...
- 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...
- 在Linux中通过Top运行进程查找最高内存和CPU使用率
按内存使用情况查找前15个进程,在批处理模式下为"top" 使用top命令查看有关当前状态,系统使用情况的更详细信息:正常运行时间,负载平均值和进程总数. 分类:Linux命令操作 ...
- Linux资源控制-CPU和内存
主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每个进程能够占用CPU多长时间, 什么时候能够占用CPU是和系统的调度密切相关的. Linux系统中有多 ...
随机推荐
- 重命名计算机名称导致TFS版本管理下的工作区问题的修复
1.问题 若在本地已有工作区之后,此时修改计算机名称重启生效后,打开本地的项目解决方案,输出窗口会提示如下图: 2.解决 输入命令:tf workspaces /collection:http://1 ...
- 两个iframe之间传值
例如:点击后会把另一个iframe中的值得到弹出 Main: <html lang="en" xmlns="http://www.w3.org/1999/xhtml ...
- ecshop在PHP 5.4以上版本各种错误问题处理
在php5.4版本之后有很多的函数与功能进行丢弃与升级功能了,现在国内很多CMS都还未按php5.4标准来做了,下面我整理了一些在ecshop在PHP 5.4以上版本各种错误问题处理. 1.PHP 5 ...
- MySQL数据库分表的3种方法
原文地址:MySQL数据库分表的3种方法作者:dreamboycx 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目 ...
- xml中使用foreach遍历对象
如果是一个带数据的List对象 <select id="selectProductMSTList" resultType="java.util.Map" ...
- Unity3D 之UGUI 文本框和编辑框
这里来讲解一下unity3D自带的UI功能,自带的UI也叫UGUI功能非常的强大,比起NGUI,更加的灵活,让用户能够更加容易的去使用. 首先创建一个文本Text 然后是文本相对应的属性 这里的属性比 ...
- lsjORM ----让开发变得更加快捷(二)
lsjORM结构 跟传统三层没有多大区别,这里添加DTO(参数列表)跟PetaPoce(数据库操作),普通的三层我们都喜欢用DBHelper或者SqlHelper来封装sql的辅助方法,PetaPoc ...
- Sql触发器脚本
ALTER Trigger [dbo].[test] --新建触发器 On [dbo].[test1] --在test1表中创建触发器 for insert --触发条件 As --事件触发后所要做的 ...
- string应用
今天在网上搜了一些资料. C# string类应用 判断是否包含子串 想要判断一个字符串中是否包含某个子串,可以用Contains方法来实现: ? public bool Contains (stri ...
- ACM——2的n次方
2的N次方 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:1715 测试通过:838 描述 编程精确计算2 ...