QFileSystemModel經常導致主線程反應遲緩

stereoMatching 2012-08-02 10:57:49

副線程

#include <QtCore>
#include <QtGui>

class FileRenameRunnable: public QThread
{

Q_OBJECT

public :

FileRenameRunnable(QString const rootPath)
: rootPath_(rootPath)
{
}

virtual void run()
{
for(int i = 0; i != 8448; ++i)
{
QFile file(rootPath_ + "/kkk" + QString::number(i) + ".jpg");
file.rename(rootPath_ + "/jjj" + QString::number(i) + ".jpg");
emit valueChanged(i);
}
}

signals:
void valueChanged(int value);

private:
QString rootPath_;
};


主線程

#include <QtCore>
#include <QtGui>

#include "fineNameRunnable.hpp"

int main(int argc, char **argv)
{
QApplication app( argc, argv );

QFileSystemModel model;
QString const rootPath = "E:/file_test/very big";

QTableView view;
view.setModel(&model);
view.setRootIndex(model.setRootPath(rootPath));

QProgressBar progress;
progress.setRange(0, 8447);

QDir::setCurrent(rootPath);
FileRenameRunnable *myTask = new FileRenameRunnable(rootPath);
app.connect(myTask, SIGNAL(finished()), myTask, SLOT(deleteLater()));
app.connect(myTask, SIGNAL(valueChanged(int)), &progress, SLOT(setValue(int)));

QSplitter splitter;
splitter.addWidget(&view);
splitter.addWidget(&progress);
splitter.show();

myTask->start();

qDebug() << "finish";

return app.exec();
}


不但主線程會被“擋住”,而且連記憶體的使用量也是直線飆升

如果使用的是QDirModel就不會有這種情形
開另外一個線程重新命名,不但主線程運作流暢無比
而且記憶體的使用量和單線程的時候比較也是相差無幾

請問這是QFileSystemModel的bug,或者是我這個新手使用不當?
如果這是bug,請問我該到哪裡通報(或者那個好心人幫我報告也好)?
謝謝
...全文
114 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
stereoMatching 2012-08-05
  • 打赏
  • 举报
回复
无论是QDirModel或者是QFileSystemModel我的写法都一样
只差在QDirModel不用设定rootPath

目前我是靠Document中“极度不推荐”的QDirModel解决当下的问题
希望能够有一个办法解决QFileSystemModel阻塞的问题
谢谢
stereoMatching 2012-08-05
  • 打赏
  • 举报
回复
>i会一直疯狂的增长下去,一直到很大的数;


#include <iostream>

int main()
{
int sum1 = 0;
for(int i = 0; i != 8448; ++i)
sum1 += i;
std::cout << sum1 << std::endl;

int sum2 = 0;
for(int i = 0; i < 8448; ++i)
sum2 += i;
std::cout << sum2 << std::endl;

std::cout<<std::boolalpha << (sum1 == sum2)<<std::endl;

return 0;
}


>对于一般的数值类型,如int,double都是可以的
这只是习惯的问题而已,偏好generic的人比较喜欢使用!=
feilinhe 2012-08-03
  • 打赏
  • 举报
回复
对了对于STL使用的迭代器当然不能用“<”,而对于一般的数值类型,如int,double都是可以的,兄弟你刚开始学习编程的吧
feilinhe 2012-08-03
  • 打赏
  • 举报
回复
对于STL来说it != std::end(data)表示不是最后的元素(空指针)
而你的for(int i = 0; i != 8448; ++i)的含义与此不一样,你的这个表示仅仅i不等于8448就可以了,i会一直疯狂的增长下去,一直到很大的数;
for(int i = 0; i < 8448; ++i):表示i只能是小于8448也就是最大i = 8447,明白吗??
stereoMatching 2012-08-03
  • 打赏
  • 举报
回复
是否应该是:for(int i = 0; i < 8448; ++i)

这两者是一样的,只是写程式的习惯不同而已
这种写法在generic programming中很常见
例如

std::list<int> data;
.......
for(auto it = std::begin(data); it != std::end(data); ++it)
{
........
}

如果你用 < 的话就无法通过编译了,但是不管是std::vector,std::list, std::map等
容器的iterator都支援!=,所以喜欢generic programming的人通常会选用!=胜于 <
feilinhe 2012-08-03
  • 打赏
  • 举报
回复
class FileRenameRunnable: public QThread中 for(int i = 0; i != 8448; ++i)
是否应该是:for(int i = 0; i < 8448; ++i)
访问真八字排盘系统介绍: 1、八字排盘 八字排盘是将年月日时按照天干地支的形式进行排列,一个时间单位代表了一个柱。八字由年柱、月柱、日柱和时柱共四个柱组成,也被称为四柱八字。八字学中基于中国阴阳五行、天干地支与刑冲克害、以及民间盲派的神煞论等方式,进一步预测爱情顺遂、工作高低、姻缘好坏、财富高低、学业成就、身体健康等事的学问。 八字排盘由以下元素组合:年月日时四柱、大运干支、胎元 、流年干支、十神、地势、神煞等。生辰八字不只是把干支历计算出来,而还要遵守月令、节令的强弱,时辰的阴阳变化进行校正。排盘分析,就是根据出生者的性别、天干地支的阴阳五行关系、进一步推算出来的一套方法论,给预测者做人生吉凶的参考数据,在未来事业、财运、婚姻、家庭等问题时,能做出风险较低的决策。 八字排盘怎么看 八字排盘由年、月、日、时四柱组成,每柱包含一个天干和一个地支,共八个字。年柱代表出生的年份,月柱代表出生的月份,日柱代表出生的日期,时柱则代表出生的时辰。每个柱的干支组合都会对个人的命运产生影响。天干地支旁边标注的正财、偏财、偏印、正印、比肩、劫财、食神、伤官、正官、七杀等,称为十神。 2、八字排盘软件介绍 我们是腾讯云市场金牌合作伙伴,广州正规软件开发公司,开发的八字排盘系统数据最全面精准,我们八字排盘采用最精确的排盘程序,而且运用“真太阳时”,进行更精确的时间划分。大家都知道我们使用的北京时间,是统一规定的标准时间。而八字排盘需要相对于太阳方位的天文时间,即平太阳时。我们国家地大物博,北京时间19时,哈尔滨已经夜幕降临,而新疆却还是太阳高挂,这时哈尔滨的天文时间可能在20:00以后,而新疆的天文时间可能在16时以前。北京时间是东经120度经线的平太阳时,如果您出生地的经度与北京时间所处的经度差异较大,或者处于单数时间点的前后,比如6点差一刻,8点,10点15分等

16,818

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧