如何设置parallel_invoke的进度条?

时间:2013-07-23 09:23:28

标签: c++ multithreading visual-studio-2010 c++11 lambda

我想要的是如何获取进度数据。无论我喜欢什么,我都可以实现吧台。我正在使用Visual C ++ 2010,所以我可以使用MFC。

现在,我正在编写多线程程序。自VC ++ 2010以来,Microsoft已经提供了PPL lib。并行模式库(PPL)提供了同时执行数据集合工作的算法。实现多线程应用程序很方便,但我遇到进度条问题。

如何设置parallel_invoke的进度条?

演示代码如下:

// parallel-invoke-structure.cpp 
// compile with: /EHsc
#include <ppl.h>
#include <string>
#include <iostream>

using namespace concurrency;
using namespace std;

// Returns the result of adding a value to itself. 
template <typename T>
T twice(const T& t) {
   return t + t;
}

int wmain()
{
   // Define several values. 
   int n = 54;
   double d = 5.6;
   wstring s = L"Hello";

   // Call the twice function on each value concurrently.
   parallel_invoke(
      [&n] { n = twice(n); },
      [&d] { d = twice(d); },
      [&s] { s = twice(s); }
   );

   // Print the values to the console.
   wcout << n << L' ' << d << L' ' << s << endl;
}

1 个答案:

答案 0 :(得分:0)

也许这不是主题,但我建议您查看Cilk而不是PPL。

以下是a course at MIT(来自Cilk的主要创作者之一),概述了其优缺点和具体用法。它非常容易使用,声称比PPL更高效(如果你担心的话)。

至于你关于进度条的具体问题,提出一个百分比是第一项任务。如果您使用计时器来映射哪些工作会花费您的成本(就时间而言),您可以使用它(通过每个工作人员的回调来注册已完成的工作)来驱动百分比。一旦你的百分比下降,将它连接到一个栏(在shell中)或GUI进度条是微不足道的。

根据工作进程的工作量(它们的粒度),您可能需要考虑instrumentation的不同方法。如果你看一下this wikipedia page,它会勾勒出许多类型的分析(统计,基于事件等)。

最后一点:我发现进度条很难正确。任何人都可以做一个酒吧。但要准确地表明需要多长时间的真实指示,需要深入了解哪些因素会影响您的表现。与任何计算机程序一样,您的性能可以根据您运行的系统(cpu体系结构,IO带宽,网络带宽)而改变。因此,即使你在盒子上可以预测它,你的客户的盒子可能会有很大的不同 - 以至于你的进度条不再能产生良好的适应症。

希望有帮助...