【问题标题】:Cancel a scheduled task取消计划任务
【发布时间】:2015-02-16 16:24:09
【问题描述】:

我有一个接收事件的 Windows Delphi 应用程序,对于这些事件中的每一个,我想以并行方式运行一个任务(这样我就可以为接下来的事件做好准备)。通过全线程库的抽象有很多方法可以做到这一点。

问题是我的部分代码需要在收到事件后立即执行(基本上是为了“解码”事件参数),而另一部分需要在几秒钟后才在什么都没有的情况下执行新的发生在相同的上下文中。 此行为应响应“仅在持续时间超过 3000 毫秒时才存储此新值,否则只需取消它”。 因此,如果新事件以相同的上下文到达,我需要“取消”正在运行的任务(等待 3000 毫秒的任务)。 我不能使用管道抽象,因为当第一阶段结束时,它会自动填充第二阶段队列,而不会询问我是否要取消它。

这可能吗?

谢谢。

【问题讨论】:

    标签: multithreading delphi omnithreadlibrary


    【解决方案1】:

    听起来你需要一个Dictionary<Context, Event>,其中的事件还带有一个“已创建”时间戳属性,以及一个后台线程,它不断检查此字典中是否有带有elapsed time > 3000ms 的事件条目。 传入事件更新时间戳和事件参数,直到线程检测到符合条件的条目,然后从字典中提取条目。

    【讨论】:

    • 这几乎是我所需要的,只是我没有使用 TDictionary 而是使用 TThreadList 可以锁定线程安全访问。我的主线程获取事件并填充 TThreadList。它还检查相同上下文的先前事件是否在 3000 毫秒以下,如果是,则将其从列表中删除。然后我有一个后台线程在此列表上循环以获取事件并完成工作(将它们记录在数据库中)。谢谢。
    猜你喜欢
    • 2019-03-26
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2011-01-22
    • 2019-06-06
    • 2021-11-06
    • 2011-12-08
    相关资源
    最近更新 更多