【问题标题】:How to pause/resume threads in OmniThreadLibrary 3?如何在 OmniThreadLibrary 3 中暂停/恢复线程?
【发布时间】:2012-08-27 10:31:39
【问题描述】:

我希望主应用程序线程能够暂停/恢复其他工作线程,假设这是可能的,那么最好的方法是什么? p>

欢迎任何适用于 Windows XP(及更高版本)的建议!

附言。我正在使用 Delphi 2010OmniThreadLibrary 3

【问题讨论】:

  • 您永远不会从外部暂停线程。主线程发出信号表示它希望线程暂停,然后线程通过等待直到发出恢复信号来响应。
  • 有关如何使用事件信号执行此操作的示例(虽然不是 OTL 框架示例),请参阅 Do I need TThreads? If so can I pause, resume and stop them?
  • 谢谢你们的帮助/链接。我相信可以从外部暂停,我有点希望看看在 OTL 中是否有一种安全/推荐的方法。
  • 如果你从外部暂停它,并且如果你的线程使用了any锁,那么你就会陷入死锁。你需要重新调整你的期望。例如,阅读有关 SuspendThread 的 Windows API 文档。

标签: multithreading delphi delphi-2010 resume omnithreadlibrary


【解决方案1】:

OmniThreadLibrary 不公开用于挂起线程的命令。挂起线程的API方法是调用SuspendThread,该函数只在两个地方调用,都不能从库外直接使用。

如果您有TOTPWorkerThread,则可以在其Handle 属性上调用SuspendThread

没有安全的、推荐的从线程自身上下文之外挂起线程的方法。这样做总是会导致问题,因为外部线程在尝试挂起它时无法确切知道另一个线程在做什么。它可能在 I/O 语句的中间,或者它可能持有其他线程正在等待的锁。

挂起线程的安全推荐方法是向它发送某种通知,您希望它自行挂起。在 OmniThreadLibrary 的上下文中,这可能意味着在工作线程上调用 Cancel

暂停线程的更好方法是根本不暂停它。挂起线程的通常情况是此时它没有什么可做的,所以当有东西可用时,你想唤醒它,以便它可以继续处理新的工作。不过,您可以在不暂停的情况下做到这一点。相反,让线程在包含工作项的队列上等待。 OmniThreadLibrary 有几种机制。您可以将每个工作单元放入一个单独的任务中,然后将这些任务放入线程池中。你也可以把你的任务放在一个简单的队列中,然后让一个线程在队列上工作。

【讨论】:

  • 我认为 OTL 演示“05_TwoWayHello_without_loop”是一个很好的起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多