最近用QT做了一个小功能,就是拷贝整个
目录,我已经把此函数写在
线程里运行,大致代码如下:
void MyThread::CopyFolder(
QString path) {
if (!QDir(path).exists()) return;
// 过滤器
QStringList filters;
QDirIterator dir_iterator(path,
filters, // hang 如果不想加入过滤器,定义一个空过滤器即可
//QDir::DirsFirst | NoFilter,
// QDir::AllDirs,
// QDir::DirsFirst | QDir::NoDotAndDotDot | QDir::AllEntries | QDir::CaseSensitive
QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden | QDir::System, // 默认传输隐藏
文件 QDirIterator::Subdirectories);
while(dir_iterator.hasNext())
{
dir_iterator.next();
// 跳过少
部分不想要的文件
const QFileInfo file_info = dir_iterator.fileInfo();
// 真正拷贝
if (file_info.isFile()) {
// 拷贝文件,主要是使用QFile::copy函数
}
else if (file_info.isDir()) {
// 创建目录,主要是使用QDir::mkdir函数
}
}
}
----------------------------------------------------------------
据我所知,多线程的出现,主要是为了利用CPU空闲时间,因为各种外设的速度相当于CPU来说太慢。但是如果我把这个目录拷贝函数写成多线程的话(假设我先
执行分析目录内所有文件信息,并能合理分配给多个线程去拷贝这些文件),会速度更快还是更慢?
表面上各个线程可以不间断使用CPU的资源进行拷贝,可是磁盘的磁头只有一个呀!磁头正在一个地方写文件,忽然接到指令要求移到另一个地方读文件,但是这样磁头会疲于奔命,因为它的移动速度远远赶不上CPU的命令,这样岂不是效率更低?
除非现在的硬盘有上千个磁头,可多处同时读写硬盘(是真的同时,不是多线程伪装的),这样才会效率很高。
那么
问题来了:
1. 多线程拷贝整个目录速度是否更快?原理是什么?
2. 现在的硬盘有多少个磁头,可同时读写硬盘吗?
提示:
王艳平老师写的《
Windows程序设计》第92页,有一个“多线程文件搜索器”,书在这里
下载?
https://book-cs.googlecode.com/svn/trunk/windows/Windows%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%8E%8B%E8%89%B3%E5%B9%B3.pdf从这个例子来看,多线程搜索确实应该更快才对,但是这是为什么呢?