一直专注于功能的开发,没注意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. MVC中的URL路由(一)

    URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据.Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与 ...

  2. WebUploader——一个页面多个实例上传图片

    WebUploader官方例子看的不是很清楚,自己也是费了点劲自己写了一下. 需求:一个单页需要多个实例来上传,一次可上传多张 条件:后台接收C# 首先:引入webuploader     webup ...

  3. 转载---SQL Server XML基础学习<1>之--FOR XML PATH

    --> 测试数据:#tbIF OBJECT_ID('TEMPDB.DBO.#tb') IS NOT NULL    DROP TABLE #tbGO CREATE TABLE #tb      ...

  4. 那天有个小孩跟我说LINQ(二)转载

    1  LINQ TO Objects续(代码下载)      新建项目 linq_Ch2控制台程序,新建一个Entity文件夹    1.1 学生成绩查询(练习Join)         有三张表如下 ...

  5. ubuntu14.04下安装Naigos和pnp4nagios

    Nagios是一个监视系统运行状态和网络信息的监视系统.Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. 安装环境:ubuntu14.04,全是最新的nagios和nagio ...

  6. Struts2 多文件下载

    Step1:导入支持jar包 commons-fileupload-1.3.1.jar commons-io-2.4.jar jstl-1.2.jar standard-1.1.2.jar commo ...

  7. jQuery弹性滑块导航

    曾起何时在某网站上看到一弹性滑块导航的效果,瞬间被些效果吸引,开始以为是用FLASH实现的,但查源代码发现用的是JQuery缓动效果. 今天心血来潮想拿这个效果练练手.也看看这段时间学习JS及jque ...

  8. 根据id设置、获取元素的文本和value

    /** * 根据id获取元素文本 * @param {String} id|元素id * return {Integer || String} text */function getText(id){ ...

  9. UVA 11078 Open Credit System(扫描 维护最大值)

    Open Credit System In an open credit system, the students can choose any course they like, but there ...

  10. Poj 1511 Invitation Cards(spfa)

    Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...