如何保持数据的进度条

How to keep data for progress bar

本文关键字:何保持 数据      更新时间:2023-10-16

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

对于下载文件,我有一个酒吧,但我想做一个酒吧解析。

解析需要大量的时间和能量,所以我的解决方案不需要使用大量的能量。

few servers -> few files -> line in file

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

但是当服务器超过1时,我的程序从两个服务器下载文件,所以我有2倍多的文件。服务器上的文件名是相同的,但当我下载文件时,我将这些文件的名称更改为"world"+" originalfile .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 [] -> thread download -> thread reading每个文件启动线程,所以如果服务器是2个,文件是4个,这些线程启动8x) ->发出init信号(发送文件,lines_in_file,server_number)+在逐行读取

时发出(currentLineWhenReading,file,server)信号

那么如何使它最好,获得大量的数据并保存它+使用很少的功率来计算这个呢?

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

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

在主GUI线程中,设置一些东西(例如一些Qt定时器…)来读取每秒的解析计数器(与互斥),并更新进度条