【发布时间】:2020-12-02 08:43:54
【问题描述】:
我正在尝试学习一点关于多线程的知识,因为我的学士论文中需要它。我想我在低理论水平上理解它,但不是在实践上。
一开始我试图创建一个非常简单的程序,我想在其中学习如何使用 QThread。我的小程序测试目录中的所有文件是否为 .txt 文件。
有一个函数只测试一个文件是否包含 .txt 并在下一个函数中使用。 我知道我知道这不是测试文件是否为 .txt 的完美测试,但这并不重要。这是关于其他事情的。
void FileTester::testIfTxt(QString &file){
if( file.contains(".txt"))
std::cout << file.toStdString() << " is .txt file" << std::endl;
else
std::cout << file.toStdString() << " is NOT .txt file" << std::endl;
}
这是不使用多线程进行测试的函数。
void FileTester::normalTest(){
QDir folderPath("D:\\programming\\C++\\multithreading-qt\\files");
QStringList filesList = folderPath.entryList(QDir::NoDotAndDotDot | QDir::Files);
auto t_start = std::chrono::high_resolution_clock::now();
for(QString& file : filesList){
testIfTxt(file);
}
auto t_end = std::chrono::high_resolution_clock::now();
double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end-t_start).count();
std::cout << elapsed_time_ms << " ms" << std::endl;
}
现在我想用多线程做同样的事情。一开始我们可以使用 3 个线程。第一个线程将获取第一个文件并进行测试,而第二个线程将获取第二个文件并进行测试,第三个线程将获取第三个文件并进行测试。当第一个线程结束工作时,比拿下一个未经测试的文件和测试等.......
我从那里开始使用函数,但我真的不明白,如何使用这样的东西。我从这样的事情开始。
void FileTester::multiThreadTest(){
auto t_start = std::chrono::high_resolution_clock::now();
allMultiThreadTest();
auto t_end = std::chrono::high_resolution_clock::now();
double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end-t_start).count();
std::cout << elapsed_time_ms << " ms" << std::endl;
}
void FileTester::allMultiThreadTest(){
QThread* thread1 = new QThread();
QThread* thread2 = new QThread();
QThread* thread3 = new QThread();
thread1->start();
thread2->start();
thread3->start();
for(QString& file : filesList){
testIfTxt(file);
}
}
同样,这不是我的学士论文中的代码。我只想学习如何在这个简单的程序上使用多线程。感谢您的帮助。
【问题讨论】:
-
你读过QThread documentation了吗?总的来说,Qt 文档非常好。
-
是的,我读到了。我明白那里发生了什么。而且我知道将来需要使用的一些功能。但是从文档中的示例来看,我只是没有在我的示例中看到用法。
-
这是@Botje 的好建议。在您的情况下,
QtConcurrent::map()会很好地工作。
标签: c++ multithreading qt qthread