我希望主应用程序线程能够暂停/恢复其他工作线程,假设这是可能的,那么最好的方法是什么?
任何适用于 Windows XP(及更高版本)的建议都将受到欢迎!
PS。我正在使用Delphi 2010和OmniThreadLibrary 3
我希望主应用程序线程能够暂停/恢复其他工作线程,假设这是可能的,那么最好的方法是什么?
任何适用于 Windows XP(及更高版本)的建议都将受到欢迎!
PS。我正在使用Delphi 2010和OmniThreadLibrary 3
OmniThreadLibrary 不公开用于挂起线程的命令。挂起线程的API方法是调用SuspendThread
,该函数只在两个地方被调用,都不能从库外直接使用。
如果你有一个TOTPWorkerThread
,你可以调用SuspendThread
它的Handle
属性。
没有安全的、推荐的从线程自身上下文之外挂起线程的方法。这样做总是会导致问题,因为外部线程在尝试挂起它时无法确切知道另一个线程在做什么。它可能在 I/O 语句的中间,或者它可能持有其他线程正在等待的锁。
挂起线程的安全推荐方法是向它发送某种通知,您希望它自行挂起。在 OmniThreadLibrary 的上下文中,这可能意味着调用Cancel
工作线程。
暂停线程的更好方法是根本不暂停它。挂起线程的通常情况是此时它没有什么可做的,所以当有东西可用时,你想唤醒它,以便它可以继续处理新的工作。不过,您可以在不暂停的情况下做到这一点。相反,让线程在包含工作项的队列上等待。OmniThreadLibrary 有几种机制。您可以将每个工作单元放入一个单独的任务中,然后将这些任务放入线程池中。您还可以将任务放在一个简单的队列中,然后让一个线程在队列上工作。