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

The*_*ude 1 delphi resume multithreading delphi-2010 omnithreadlibrary

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

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

PS.我正在使用Delphi 2010OmniThreadLibrary 3

Rob*_*edy 6

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

如果你有TOTPWorkerThread,你可以打电话SuspendThread给它的Handle财产.

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

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

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