开发的时候,一定要及时控制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系统中有多 ...
随机推荐
- Git之路--2
- Wireshark - 过滤规则
使用 Wireshark 的默认设置抓包时,会得到大量的冗余信息,以至于很难找到自己所需的封包.使用过滤器可以帮助我们在庞杂的结果中快速地找到我们所需的封包.过滤器分为两种:捕捉过滤器和显示过滤器. ...
- CSS控制长文本内容显示(截取的地方用省略号代替)
自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,下面介绍的是CSS如何实现处理的方法. 现实中经常出现一些内容比较长的文本,为了使整体布局美观,需要将文本内容控制在一行 ...
- 解决Android Studio启动速度慢的问题。避免每次启动Android Studio都要fetching Android sdk compoment information。
Android Studio每次启动都要去fetching sdk,由于Android sdk 官网在大陆连不上,所以每次启动时界面都会停在那里很久. 解决办法就是设置取消每次fetching sdk ...
- ORACLE 11g R2数据库安装硬件环境要求
物理内存要求:最小1G,在windows7,windows8,windows8.1上最小2G. 虚拟内存(或分页空间)容量要求: Available RAM Swap Space Required B ...
- swift 自行理解
- iOS开发——文本高度
1.简单的计算文本高度 // 要计算的文本内容 NSString *testString = @"刘成利,软件工程专业毕业,iOS开发者,目前工作于北京,在证券金融领域从事iOS App开发 ...
- js实现一个砖头在页面拖拉效果
用js实现一个砖头在页面,但鼠标点击拖动时,砖头在页面上形成拖拉效果: 刚开始时: 鼠标点击拖动后: 实现代码: <html> <head> <meta ...
- HTML知识点纲要(1)
什么是 HTML?HTML,全称是Hyper Text Markup Language,即超文本标记语言.是用来描述网页的一种标记语言. HTML 标签HTML标签是由尖括号包围的关键词,通常成对出现 ...
- Git---Git及GitHub使用笔记
一.远程项目获取(克隆) syntax: $ git clone <版本库的网址> $ git clone <版本库的网址> <本地目录名> example: $ ...