【问题标题】:Programming with QThread multithreading in C++在 C++ 中使用 QThread 多线程编程
【发布时间】: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


【解决方案1】:

QThread documentation 与大多数 Qt 文档一样,非常好,但代码示例可能有点压倒性。

QThread的使用方式基本上有两种:

子类化 QThread

当您想在线程上运行一些代码并在代码完成时退出线程时很有用。

创建QThread 的子类并覆盖其run() 函数。你放入那个函数的代码会在线程中运行,当函数返回时,线程退出。

要启动线程,只需创建子类的实例并在其上调用start()

在线程上处理信号

当您想将线程保留在后台并偶尔发送一些工作要做时很有用。这种方法需要一些样板代码,因为您需要一个对象来发出信号,而另一个对象通过插槽来接收它。

创建QObject 的子类,并为它提供一个您选择的公共槽。

创建QThread 的实例(此处不需要子类)。 run() 的默认实现包含一个事件循环,它只是等待信号并运行相应的槽,就像 QApplication::exec() 为您的主线程所做的那样。

创建QObject 子类的实例。使用QObject::moveToThread() 将后者移动到您的新线程。这样做的效果是,任何被信号调用的槽都将在该线程上运行,而不是在主线程上运行。请参阅thread affinityqueued connections

将插槽连接到主线程上任何QObject 子类发出的信号。

要将工作发送到线程,只需发出该信号。

注意:您传递给信号的任何参数都必须为 Qt 的元类型系统所知。大多数内置的 Qt 类型都可以。如果您违反此规则,您将在运行时收到警告

【讨论】:

  • 感谢您提供更多详细信息。这些东西大部分是我理解和阅读的。但我只是不明白如何将它实施到我的问题上。但是感谢您提供更多详细信息。我想我会问我的学士论文的领导。
猜你喜欢
  • 2011-08-05
  • 2015-08-21
  • 1970-01-01
  • 2015-07-31
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多