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

标签 multithreading delphi delphi-2010 resume omnithreadlibrary

我希望主应用程序线程能够暂停/恢复其他工作线程,如果有可能,执行此操作的最佳方法是什么?

在Windows XP(及更高版本)上可以使用的任何建议都将受到欢迎!

PS。我正在使用 Delphi 2010 OmniThreadLibrary 3

最佳答案

OmniThreadLibrary没有公开任何用于挂起线程的命令。挂起线程的API方法是调用SuspendThread,该函数仅在两个位置调用,这两个位置都不能从库外部直接使用。

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

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

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

挂起线程的更好方法是根本不挂起它。挂起线程的通常情况是,目前没有任何事情要做,因此,当有可用的东西时,您要唤醒它,以便它可以继续处理新工作。不过,您可以做到这一点而无需暂停。而是让线程在包含工作项的队列上等待。 OmniThreadLibrary为此提供了两种机制。您可以将每个工作单元放入一个单独的任务中,然后将这些任务放入线程池中。您还可以将任务放在一个简单的队列中,然后让一个线程在该队列上工作。

关于multithreading - 如何在OmniThreadLibrary 3中暂停/恢复线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12235116/

相关文章:

java - Callable 是如何工作的?可调用对象如何返回值?

c++ - MinGW 错误 : ‘thread’ is not a member of ‘std’

c++ - QThreads 中断槽和信号

java - java中同步对象是如何工作的

delphi - TMonitor.Destroy 中的无效指针操作

delphi - Delphi 中的实时麦克风?

xml - 使用带有命名空间的 ChildNodes 从 XML 中读取值

delphi - Free() 方法实际上在内部做了什么以及它如何处理对象引用?

delphi - Delphi中使用动态按钮的MouseDown事件

xml - 解析 XML 数据绑定(bind)向导时值为空