带回调的调度工具

时间:2011-02-23 09:52:02

标签: asynchronous scheduling

我尝试开发业余网页游戏(仅仅是为了好玩),我正在寻找一种允许我(使用用例)的工具:

  • 使用finish_at属性将系统中的项目排入队列。 通常,它将用于单位生产队列;
  • 能够更改项目的finish_at属性。 呃,如果霜冻袭击营房,它的生产暂时停止;
  • 能够在进展中设置回调(以给定的百分比表示)。 当玩家建立一个Wonder时,我想通知他的敌人进展;

你知道这样的工具吗?如果你不这样做,你可以向我推荐哪些技术来构建它?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我会选择双向链表,其中每个节点可以同时是多个不同列表的成员:

struct node
{
    struct node *factory_prev;
    struct node *factory_next;
    struct node *finish_prev;
    struct node *finish_next;
    struct node *progress_prev;
    struct node *progress_next;
};

第一个列表链接该工厂生产的所有物品;列表库是工厂对象。当工厂受到攻击时,您可以走这个列表来查找现在已经延迟的所有项目,这样您就可以将它们从其他列表中删除。

第二个列表链接所有正在生成的项目,在完成时排序。查看第一个元素可以在O(1)中告诉您项目是否已完成。

第三个列表链接所有广播进度事件的项目,再次按下一个此类事件发生的时间排序。这种机制非常类似于“完成”列表,理论上可以合并,但是有一个单独的,更短的列表允许您更快地找到需要进度广播的项目。

由于这些是双链表,只要你有一个指向节点的指针,你就知道如何取消它与所有其他列表的链接。请注意,在多线程程序中,您可能仍需要某种形式的锁定。

另一种方法是重新安排在通常生产时延迟的物品;然而,对于也有进度报告的项目来说,这很难做到。