c++ - 请求函数的最佳方法

标签 c++ mfc callback

我们有一个用 C++/MFC 编写的 Windows 服务,它必须在主机工作站上执行许多任务,其中一些任务可能会长时间运行,并且在完成之前可能会失败几次。每个任务只需要按顺序完成一次。

我最初考虑使用某种形式的回调来重试失败的任务,但每个函数都有完全不同的参数,代码已经编写和测试,只需要一个重新排队的方法。

我想我们可以将失败的任务写入注册表,sleep() 一段时间,然后重新启动服务。有没有更好的方法?

TIA..

最佳答案

我在我的专业项目中做着完全相同的事情。我的服务器组件从不同的来源获取可运行对象并在单独的线程中顺序执行它们。我所有的可运行对象都使用不同的参数,但它们都有一个函数 run(void* pUserParam)。 void* 参数是一个特殊对象,包含不同类型( double 、字符串等)的字段集合。

我的组件正在对可运行对象进行排队,并在每次释放线程时启动一个新对象。当然,我的组件在队列为空时处于休眠状态,并在对象到达时唤醒。在您的情况下,当任务失败时,您只需要将其重新排队,它会在稍后自动重试该任务。

要实现这些你需要:

  1. 管理队列的池机制 任务,
  2. 一个任务对象,其中包含有关要启动的可运行对象和参数的所有信息,
  3. 包含您要执行的操作的可运行对象。

工作原理:

您的服务正在倾听需求,

  1. 当需求到来时,交给Pool机制,
  2. 池获取可运行对象及其参数并创建任务。此任务已排队, (2b. 如果队列为空,池唤醒执行线程,)
  3. 线程从队列中挑选一个任务并调用可运行对象的 Run() 函数执行它,并将先前存储在任务中的参数传递给它, (3b. 如果任务失败,线程使用可运行对象及其参数重新排队任务,)
  4. 如果队列为空,则线程选择一个新任务或休眠。

这是我的方法,我知道这很有效。我知道使用这种方法您需要重写应用程序的一部分,但是在添加一种任务时唯一需要修改的是创建一个新的可运行对象(一种任务 => 一个从抽象对象继承的可运行对象).

希望对你有帮助

关于c++ - 请求函数的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1503770/

相关文章:

c++ - 从 MFC 中的工作线程调用 Beginwaitcursor 函数

c++ - 以编程方式完全删除 MFC 工具栏中的按钮

javascript - 在 Jquery 中完成 for 循环后如何触发回调函数?

JavaScript 构造函数在定义属性时返回解析错误

c++ - 线程 vs 基于任务 vs 异步编程

c++ - 调用一个函数并从多个函数中取出一个返回

c++ - C++中如何计算两个数的差?

c++ - MFC 7.0 C++ 如何从 CImage 获取 CBitmap

java - 在 Java OpenCV 中替换像素的等效代码

javascript - 为什么在语法更简洁的情况下使用 javascript 回调?