1

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

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

PS。我正在使用Delphi 2010OmniThreadLibrary 3

4

1 回答 1

6

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

如果你有一个TOTPWorkerThread,你可以调用SuspendThread它的Handle属性。

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

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

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

于 2012-09-02T15:48:55.473 回答