一直专注于功能的开发,没注意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使用率以及使用内存大小等三个问题(一个星期检查一次)的更多相关文章

  1. 生成CPU使用率 sin 曲线 控制cpu使用率 编程之美

    入职Oracle 以后想着把之前写过的<编程之美>中控制CPU使用率曲线的程序再写一边, 可是总是由于入职须要学习的东西太多, 没有时间. 程序早就写好了. 最终有机会贴出来了.o(∩∩) ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. python指定cpu使用率,与内存占用率

    python指定cpu使用率,与内存占用率 """ runing.py -c 2 -t 0.01 -m 1000 -c cpu核数,不加-c参数为最大核数 -t cpu运 ...

  4. python控制cpu使用率

    以下亲测可行. 使用方法:命令行模式 runing.py -c 2 -t 0.01 -c 指定cpu核数:不指定-c参数默认为所有核数. -t 数值越大,cpu使用率越低. runing.py &qu ...

  5. Linux 控制CPU使用率

    曾经看过<编程之美>上提到说使 CPU的使用率固定在百分之多少.然后这次刚好要用到这个东西,下面是一个简单的实现.基于多线程: Linux 版本: #include <iostrea ...

  6. CPU使用率和平均负载

    转载: https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487782&idx=3&sn=3f04bb053d ...

  7. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  8. 在Linux中通过Top运行进程查找最高内存和CPU使用率

    按内存使用情况查找前15个进程,在批处理模式下为"top" 使用top命令查看有关当前状态,系统使用情况的更详细信息:正常运行时间,负载平均值和进程总数. 分类:Linux命令操作 ...

  9. Linux资源控制-CPU和内存

    主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每个进程能够占用CPU多长时间, 什么时候能够占用CPU是和系统的调度密切相关的. Linux系统中有多 ...

随机推荐

  1. [转]SharePoint 2010 Download as Zip File Custom Ribbon Action

    在SharePoint 2010文档库中,结合单选框,在Ribbon中提供了批量处理文档的功能,比如,批量删除.批量签出.批量签入等,但是,很遗憾,没有提供批量下载,默认的只能一个个下载,当选择多个文 ...

  2. tomcat启动正常,404. Eclipse没有正确部署工程项目

    http://blog.csdn.net/lynn_wgr/article/details/7751228 在eclipse中新建的Dynamic Web Project.写好代码后,选择Run on ...

  3. java内存

    java内存分为四部分: 1).栈区(stacksegment),由编译器自动分配释放,存放函数的参数值和局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源: 2).堆区(heapseg ...

  4. 转载:为什么Linux不需要磁盘碎片整理

    转载自:www.aqee.net 如果你是个Linux用户,你可能听说过不需要去对你的linux文件系统进行磁盘碎片整理.也许你注意到了,在Liunx安装发布包里没有磁盘碎片整理的工具.为什么会这样? ...

  5. ios隐藏导航栏底线条和导航、状态栏浙变色

    方法一遍历法: 在你需要隐藏的地方调用如下代码 [self findlineviw:self.navigationBar].hidden = YES; -(UIImageView*)findlinev ...

  6. iOS-事务相关

    事务管理 事务(Transaction):1.构成单一逻辑工作单元的操作集合DBMS中的用户程序DBMS外的可执行程序对数据库的读/写操作序列2.读从数据库中读取数据,首先从磁盘中读到内存(Buffe ...

  7. OC单例模式的实现

    SingleClass.m #import <Foundation/Foundation.h> @class SingleClass; static SingleClass *instan ...

  8. myeclipse、eclipse去掉无用的workSpace

    在 eclipse\configuration\.settings\org.eclipse.ui.ide.prefs 文件里面有下面这段,我们可以从 RECENT_WORKSPACES 里面看到它列出 ...

  9. javascript中event.keycode大全

    keycode 8 = BackSpace BackSpace  keycode 9 = Tab Tab  keycode 12 = Clear  keycode 13 = Enter  keycod ...

  10. jeesite 一对多,对子表单独修改时出现 HV000030: No validator could be found for type:

    这是由于springmvc校验功能造成的,解决办法参见我的百度回答 http://zhidao.baidu.com/question/2141673418419314468