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

Multithreading 如何暂停/恢复OmniThreadLibrary 3中的线程?,multithreading,delphi,delphi-2010,resume,omnithreadlibrary,Multithreading,Delphi,Delphi 2010,Resume,Omnithreadlibrary,我希望主应用程序线程能够暂停/恢复其他工作线程,假设这是可能的,那么最好的方法是什么 任何能在Windows XP及更高版本上运行的建议都将非常受欢迎 另外,我使用的是Delphi 2010和OmniThreadLibrary 3,OmniThreadLibrary不公开挂起线程的命令。挂起线程的API方法是调用SuspendThread,该函数只在两个位置调用,这两个位置都不能从库外部直接使用 如果您有一个TOTPWorkerThread,您可以在其Handle属性上调用SuspendThre

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

任何能在Windows XP及更高版本上运行的建议都将非常受欢迎


另外,我使用的是Delphi 2010和OmniThreadLibrary 3,OmniThreadLibrary不公开挂起线程的命令。挂起线程的API方法是调用SuspendThread,该函数只在两个位置调用,这两个位置都不能从库外部直接使用

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

没有安全的、推荐的方法从线程自身的上下文之外挂起线程。这样做总是会导致问题,因为外部线程无法确切地知道另一个线程在尝试挂起它时正在做什么。它可能在I/O语句的中间,或者它可能持有其他线程正在等待的锁。 挂起线程的一种安全的、推荐的方法是向它发送某种通知,告知您希望它挂起自己。在OmniThreadLibrary的上下文中,这可能意味着对工作线程调用Cancel


挂起线程的更好方法是根本不挂起它。挂起线程的通常情况是,此时已无需执行任何操作,因此,当某些内容可用时,您希望将其唤醒,以便它可以继续处理新的工作。不过,您可以在不暂停的情况下执行此操作。相反,让线程在包含工作项的队列上等待。OmniThreadLibrary为此提供了几种机制。您可以将每个工作单元放在单独的任务中,然后将这些任务放在线程池中。您还可以将任务放在一个简单的队列中,然后让一个线程在该队列上工作。

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

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

没有安全的、推荐的方法从线程自身的上下文之外挂起线程。这样做总是会导致问题,因为外部线程无法确切地知道另一个线程在尝试挂起它时正在做什么。它可能在I/O语句的中间,或者它可能持有其他线程正在等待的锁。 挂起线程的一种安全的、推荐的方法是向它发送某种通知,告知您希望它挂起自己。在OmniThreadLibrary的上下文中,这可能意味着对工作线程调用Cancel


挂起线程的更好方法是根本不挂起它。挂起线程的通常情况是,此时已无需执行任何操作,因此,当某些内容可用时,您希望将其唤醒,以便它可以继续处理新的工作。不过,您可以在不暂停的情况下执行此操作。相反,让线程在包含工作项的队列上等待。OmniThreadLibrary为此提供了几种机制。您可以将每个工作单元放在单独的任务中,然后将这些任务放在线程池中。您还可以将任务放在一个简单的队列中,然后让一个线程在该队列上工作。

您从不暂停外部线程。主线程发出信号希望线程暂停,然后线程通过等待信号来响应,直到它恢复。例如,如何使用事件信号而不是OTL框架示例,请参阅。感谢大家的帮助/链接。我相信从外部暂停是可能的,我有点希望看看在OTL中是否有一种安全/推荐的方法。如果从外部暂停,并且线程使用了任何锁,那么就会出现死锁。你需要重新调整你的期望。例如,请阅读SuspendThread的Windows API文档。您从不从外部暂停线程。主线程发出信号希望线程暂停,然后线程通过等待信号来响应,直到它恢复。例如,如何使用事件信号而不是OTL框架示例,请参阅。感谢大家的帮助/链接。我相信从外部暂停是可能的,我有点希望看看在OTL中是否有一种安全/推荐的方法。如果从外部暂停,并且线程使用了任何锁,那么就会出现死锁。你需要重新调整你的期望。例如,阅读SuspendThread的Windows API文档。我认为没有循环的OTL演示05_TwoWayHello_是一个很好的起点。我认为没有循环的OTL演示05_TwoWayHello_是一个很好的起点。