我制作了一个multiThread下载应用程序,现在我要显示每个下载线程的进度,就像在IDM中一样,当下载数据时,进度条会通知下载数据,并且你知道progressBar中的每个线程位置都必须从指定的位置开始,现在的问题是: 如何根据下载的数据增加进度位置,使用IDHTTPWORK在monothread中非常简单,所以我可以在多线程应用程序中使用相同的方法,还是有另一种简单的方法来实现? 我是否需要同步增加位置的指令?
答案 0 :(得分:3)
假设您有N次下载,已知大小为M[i]
个字节。在开始下载之前,将这些值相加以获得要下载的总字节数M
。
当线程正在工作时,它们会跟踪到目前为止已经下载了多少字节,m[i]
说。然后,在任何时间点,完成任务的比例为:
Sum(m[i]) / M
您可以使用计时器更新主线程的进度。每次计时器触发时,计算m[i]
计数的总和。只要m[i]
值对齐,就不需要在此处进行同步。任何数据竞赛都是良性的。
现在,m[i]
可能不会存储在数组中。您可能有一组下载线程对象。每个对象都存储了与该下载对象相关的所有信息,包括m[i]
。
或者,您可以使用与单线程代码相同的同步更新。当您获得新的进度信息时,删除计时器并从生成的线程更新。但是,有很多线程存在大量同步,这可能会导致争用。上面的无锁方法将是我的偏好。即使它涉及定时器的轮询。
答案 1 :(得分:1)
你可以看一下15年前Michael Dunn撰写的文章中开发的子类MFC列表控件:文章/ 79 / Neat-Stuff-to-Do-in-List-Controls-Using-Custom-Dra on codeproject dot com。
如果你在线程创建时实现其中一个,比如CXListCtrl * pListCtrl,那么该线程的进度报告就像调用这样的调用一样简单:
pListCtrl->SetProgress(mItem,0);
什么时候开始显示进度,
pListCtrl->SetProgress(mItem,0, i);
当你完成任务时。
实际上,如果您只是想要进度条功能并且不关心所有内容,那么您可以获取并使用而无需修改(或许可证问题)Article / Article / Article中的工作队列文章中的类XListCtrl.cpp 3607 /同一网站上的工作队列。