gpt4 book ai didi

multithreading - Qt-如何通过在不同的线程中执行资源密集型任务来简化应用程序

转载 作者:行者123 更新时间:2023-12-03 13:20:32 25 4
gpt4 key购买 nike

我正在使用 Qt(C++)创建一个音乐库应用程序。它涉及一种按给定顺序执行以下工作的方法-

  • 列表 通过递归遍历目录来获取音频文件。
  • 阅读每个文件以收集 ID3 标签。
  • 从文件中提取艺术品图像。
  • 将 ID3 标签保存在数据库中。

  • 上述任务集非常耗费资源。对于 N ~ 1000 ,完成任务大约需要一分半钟,在执行此序列的过程中,GUI 卡住并且响应不佳,因为我目前没有使用其他线程。

    我已经看过一些 Qt 线程的示例,它们或多或少地告诉了如何按预期并行执行操作,但在这些示例中,实现并行性或并发性是一项要求,因为它们没有任何其他选择。但是对于我的应用程序,是否使用多个线程是一个选择。目标是确保 GUI 在执行资源密集型任务期间保持响应性和交互性。我非常感谢任何专家的建议,可能是 Qt 中的代码模板或示例,以在不同的线程中执行资源密集型任务。

    主线程中的代码-
    QStringList files;
    QString status;
    createLibrary(files, status); //To be done in a different thread

    if(status == "complete"){
    //do something
    }

    非常感谢您的时间!

    最佳答案

    您可以使用 QtConcurrent 模块。

    使用QtConcurrent::map()遍历文件列表并在单独的线程中调用方法:

    QFuture<void> result = QtConcurrent::map(files, createLibrary);

    QFutureWatcher处理完成后会发送一个信号:
    QFutureWatcher<void> watcher;
    connect(&watcher, SIGNAL(finished()),
    this, SLOT(processingFinished()));

    // Start the computation.
    QFuture<void> result = QtConcurrent::map(files, createLibrary);
    watcher.setFuture(result);

    顺便说一句,由于存在大量不良文件,音乐播放器 Amarok 决定将 id3 标签扫描器放在一个单独的进程中。见 here了解更多信息。

    关于multithreading - Qt-如何通过在不同的线程中执行资源密集型任务来简化应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17469908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com