c++ - 如何为 parallel_invoke 设置进度条?

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

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

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

如何为 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;
}

最佳答案

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

这里是 a course at MIT (来自 Cilk 的主要创建者之一)概述了它的优点、缺点和具体用法。它非常易于使用,并且声称其性能比 PPL 高得多(以防您担心这一点)。

至于您关于进度条的具体问题,得出百分比是首要任务。如果你使用计时器来映射哪些工作花费了你多少(根据挂钟时间),你可以使用它(通过每个 worker 的回调来注册完成的工作)来驱动百分比。一旦你降低了百分比,将它连接到一个栏(在 shell 中)或 GUI 进度条就很简单了。

根据工作进程的工作量(它们的粒度),您可能需要考虑不同的 instrumentation 方法。 .如果你看this wikipedia page ,它将概述多种类型的分析(统计、基于事件等)。

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

希望对您有所帮助...

关于c++ - 如何为 parallel_invoke 设置进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806261/

相关文章:

c# - 锁定对象字典以减少 C# 中的延迟?

java - Netty - 在java中并发发送消息的最佳方式

asp.net - css中的图片相对路径

c++ - 将对象(而不是指针)向下转换为它们已知的派生类型是否安全?

c++ - 如何从 C++ 将某些内存范围标记为不可缓存?

c++ - 折叠嵌套的 std::future

C# 应用程序抛出 system.BadImageFormat 异常。在 x64 中编译的依赖项

multithreading - JMeter一次只对全局变量进行初始化

c++ - QIBASE 建立但未找到

visual-studio-2010 - 删除解决方案中未使用的 cs 文件