重新排列函数的最佳方法

时间:2009-10-01 12:50:18

标签: c++ mfc callback

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

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

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

TIA ..

1 个答案:

答案 0 :(得分:2)

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

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

要实现这些目标,您需要:

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

    您的服务正在倾听需求,

    1. 当需求到达时,它会将其提供给池机制,
    2. Pool获取runnable对象及其参数并创建任务。这个任务排队, (2b。如果队列为空,则池唤醒执行线程,)
    3. 线程从队列中获取一个任务并执行它调用runnable对象的Run()函数并将之前存储在任务中的参数传递给它, (3b。如果任务失败,则线程使用runnable对象及其参数重新排队任务,)
    4. 线程获取新任务或在队列为空时休眠。
    5. 这是我的方法,我知道这很好。我知道使用这种方法你需要重写你的应用程序的一部分但是在添加一种任务时唯一要修改的就是创建一个新的runnable对象(一种task =>一个继承自abstract的runnable对象一个)。

      希望这会对你有所帮助