如何在OmniThreadLibrary 3中暂停/恢复线程?

时间:2012-09-02 10:15:21

标签: multithreading delphi delphi-2010 resume omnithreadlibrary

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

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

PS。我正在使用 Delphi 2010 OmniThreadLibrary 3

1 个答案:

答案 0 :(得分:6)

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

如果您有TOTPWorkerThread,则可以在SuspendThread媒体资源上致电Handle

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

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

暂停线程的更好方法是根本不暂停它。暂停线程的通常情况是,此时没有任何东西可以执行,所以当某些内容可用时,您需要将其唤醒以便继续处理新工作。但是,您可以在不暂停的情况下执行此操作。而是让线程在包含工作项的队列上等待。 OmniThreadLibrary有几种机制。您可以将每个工作单元放入单独的任务中,然后将这些任务放入线程池中。您还可以将任务放在一个简单的队列中,然后让一个线程处理队列。