如何保留进度条的数据

时间:2014-08-10 09:00:32

标签: c++ multithreading qt

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

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

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

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 [] - &gt; files [] - &gt;线程下载 - &gt;线程阅读(这些   线程从每个文件开始,因此如果服务器是2,文件4是这些线程   开始8x) - &gt;发出初始化信号(发送文件,lines_in_file,server_number)   读取每行一行时发出+ emit(currentLineWhenReading,file,server)信号

那么如何使它成为最好的,获取大量数据并保持它+使用litte power来计算它?

1 个答案:

答案 0 :(得分:0)

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

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

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