题
我有A类和清单的对象。一个具有功能f,应当执行的每一个X秒钟(对于第一个实例,每1第二,对于秒实例中,每5秒钟,等等)。我有一个计划程序的类是负责执行的职能在正确的时间。什么我想要做的是创建一个新的类,ATime,即将举行ptr一个实例和一个时间::f应当执行。该调度程序将举行一个分优先排队的Atime.
- 你认为这是正确的执行?
- 应该ATime是一套类的计划程序?
解决方案
从你所描述的,听起来可能的工作:-)
恕我直言类 ATime
属于调度比A这是必要的调度程序来完成其工作,并且它不需要A事实上,一个(与世界其他地)甚至不需要知道关于它的存在-所以把它嵌套的私人类的调度程序将适用于我。
其他提示
这可能是有点太先进的,但这里去...
提升:功能 和 提升::bind 可用于实现一个计划程序,不需要知道任何关于A类这会使你的调度程序更为通用和重复使用的。
这里是一些代码样本,说明如何提高这些设施可以用在你的情况:
#include <ctime>
#include <queue>
#include <boost/function.hpp>
#include <boost/bind.hpp>
struct Foo
{
void onScheduler(time_t time) {/*...*/}
};
struct Bar
{
void onScheduler(time_t time) {/*...*/}
};
typedef boost::function<void (time_t)> SchedulerHandler;
struct SchedulerEvent
{
bool operator<(const SchedulerEvent& rhs) const {return when < rhs.when;}
SchedulerHandler handler;
time_t when;
};
class Scheduler
{
public:
void schedule(SchedulerHandler handler, time_t when)
{
SchedulerEvent event = {handler, when};
queue_.push(event);
}
private:
std::priority_queue<SchedulerEvent> queue_;
void onNextEvent()
{
const SchedulerEvent& next = queue_.top();
next.handler(next.when);
queue_.pop();
}
};
int main()
{
Scheduler s;
Foo f1, f2;
Bar b1, b2;
time_t now = time(0);
s.schedule(boost::bind(&Foo::onScheduler, &f1, _1), now + 1);
s.schedule(boost::bind(&Foo::onScheduler, &f2, _1), now + 2);
s.schedule(boost::bind(&Bar::onScheduler, &b1, _1), now + 3);
s.schedule(boost::bind(&Bar::onScheduler, &b2, _1), now + 4);
// Do scheduling...
return 0;
}
注意, Scheduler
什么都不知道关于 Foo
& Bar
, ,反之亦然。所有 Scheduler
真正想要的是一个"回叫"函子相匹配的签名指定的通过 SchedulerHandler
.
如果你需要一个 SchedulerEvent
可撤销的,事情变得有点复杂,因为 boost::function
对象是没有可比性。为了解决这个问题,则需要返回某种类型的"连接"标记注册时的事件。这基本上是什么样的提升。信号。
希望这会有所帮助。
这种类最好是由一个私人的结构嵌套在你的调度程序类,因此可以很容易地访问所有领域内的调度程序的类。(所有领域的结构是公开的默认。)
至于第二部分(和问题标题),国际海事组织,它完全是一个品味的问题。你可以只好选择,以减少混乱的定义中的调度程序类和地方ATime在subnamespace有警告名称(喜欢 detail
)保持人们使用它。毕竟,如果它只是用于计划程序,有没有什么需要隐藏了太多的-没人会想到使用它。
或许它可能是不同的用C++0x(我认为我已经听到一些谣言如何改变的无障碍的规则之间的嵌套和父母类别,或所以,在这种情况下筑巢可能更有价值的).
对于泛型的你可能还需要使用模板,也许是结束了 Scheduler<A>
(使用 TimedOperation<A>
)(或一大潜在改进/概括的那样)?