【问题标题】:How to keep data for progress bar如何保留进度条的数据
【发布时间】:2014-08-11 14:49:22
【问题描述】:

我的程序从服务器下载文件,然后解析它。

对于下载文件,我有一个栏,但我想制作栏进行解析。

解析需要花费大量时间和精力,因此我的解决方案不必使用大量电力。

few servers -> few files -> line in file

即一次,我从服务器下载文件(大约 4-5 个文件),下载后开始解析。

但是当服务器超过 1 台时,我的程序会从两台服务器下载文件,所以我有 2 倍以上的文件。服务器上的文件名相同,但是当我下载文件时,我将这些文件的名称更改为“world”+“orginalfile.txt”

我想过这样的事情: map<int server,std::map<int file(<make it enum),{current line, max lines} >> (struktura)

因为在读取文件时,我想让 emit 将数据发送到窗口。 当开始阅读我想发送(file,lines_in_file,server) 阅读时发送(file,current_line,world) 然后在读取此数据的窗口中将此数据推送到某个变量(如上例)并运行第二个函数来计算进度条。

servers[] -> files [] -> 线程下载 -> 线程读取(这些 线程启动每个文件,所以如果服务器是 2 和文件 4 这些线程 开始 8x) -> 发出初始化信号 (send file,lines_in_file,server_number) + 逐行读取时发出 (currentLineWhenReading,file,server) 信号

那么如何做到最好,获取大量数据并保持它+使用微弱的力量来计算呢?

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:

    在单独的线程中解析。在解析(或使用一些原子增量)时增加(使用互斥锁)一些计数器,例如在this answer

    可能解析线程主要是 IO 绑定的。所以它通常会等待磁盘 IO。在这种情况下,互斥锁的小开销是微不足道的。

    在主 GUI 线程中,设置一些东西(例如一些 Qt timer...)以每秒读取解析计数器(使用互斥锁),并更新进度条

    【讨论】:

    • 你的意思是在解析这些线程时有一个计数器(即int counter?但是互斥锁不会减慢解析操作?以及如何通过 std::async 中的引用将指针作为 arg 发送给这个 var?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多