c++ - 如何为进度条保留数据

标签 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)

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

servers[] -> files [] -> thread download -> thread reading (these threads start per file, so if servers are 2 and files 4 these threads start 8x) -> emit init signal (send file,lines_in_file,server_number) + emit (currentLineWhenReading,file,server) signal when reading line-per-line

那么如何让它成为最好的,获取大量数据并保存它+使用小功率来计算呢?

最佳答案

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

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

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

关于c++ - 如何为进度条保留数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25227071/

相关文章:

c# - 用于创建 DLL : C++ or C# 的编程语言

C++ STL vector 深度删除

c++ - 有没有更好的方法在 C++ 中使用异步 TCP 套接字而不是轮询或选择?

c++ - ifstream 缓冲区限制/溢出? C++ (_cnt?)

c++ - pthread_cond_wait() 没有等待,返回 int 6

c++ - QSpinBox ValueChanged 被多次触发

c++ - 如何修复 "GStreamer-CRITICAL **: gst_sample_get_buffer: assertion ' GST_IS_SAMPLE(示例 )' failed"

c++ - Qt与图像处理

windows - 断言当前线程不持有 CRITICAL_SECTION 锁

multithreading - 交换的替代版本!还返回换出的值(value)