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