1

我想要的是如何获取进度数据。我可以随心所欲地实施酒吧。我使用的是 Visual C++ 2010,所以我可以使用 MFC。

现在,我正在编写多线程程序。自 VC++ 2010 以来,Microsoft 已经提供了 PPL 库。并行模式库 (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;
}
4

1 回答 1

0

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

这是MIT 的一门课程(来自 Cilk 的主要创建者之一),概述了它的优缺点和具体用法。它非常易于使用,并且声称比 PPL 性能更高(如果您对此感到担忧)。

至于您关于进度条的具体问题,首先要提出一个百分比。如果您使用计时器来映射哪些工作花费了您什么(就墙上时间而言),您可以使用它(通过每个工人的回调来登记已完成的工作)来推动百分比。一旦你的百分比下降,将它连接到一个栏(在 shell 中)或一个 GUI 进度条是微不足道的。

根据您的工作进程所做的工作量(它们的粒度),您可能需要考虑不同的检测方法。如果您查看此维基百科页面,它将概述许多类型的分析(统计、基于事件等)。

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

希望有帮助...

于 2013-07-24T06:18:54.110 回答