OmniThreadLibrary не предоставляет команд для приостановки потока. Метод API для приостановки потока заключается в вызове SuspendThread
, и эта функция вызывается только в двух местах, ни одно из которых не доступно для прямого использования вне библиотеки.
Если у вас есть TOTPWorkerThread
, вы можете вызвать SuspendThread
в его свойстве Handle
.
Не существует безопасного рекомендуемого способа приостановки потока вне его собственного контекста. Это неизменно приводит к проблемам, потому что внешний поток не может точно знать, что делает другой поток в тот момент, когда он пытается его приостановить. Он может находиться в середине оператора ввода-вывода или может удерживать блокировку, которую ожидают другие потоки.
Безопасный и рекомендуемый способ приостановить поток — отправить ему какое-либо уведомление о том, что вы хотите, чтобы он приостановил сам себя. В контексте OmniThreadLibrary это может означать вызов Cancel
в рабочем потоке.
Лучший способ приостановить поток — не приостанавливать его вообще. Обычный случай приостановки потока заключается в том, что ему больше нечего делать в данный момент, поэтому, когда что-то становится доступным, вы хотите разбудить его, чтобы он мог продолжить обработку новой работы. Однако вы можете сделать это без приостановки. Вместо этого заставьте поток ожидать в очереди, содержащей рабочие элементы. В OmniThreadLibrary для этого есть несколько механизмов. Вы можете поместить каждую единицу работы в отдельную задачу, а затем поместить эти задачи в пул потоков. Вы также можете поместить свои задачи в простую очередь, а затем сделать так, чтобы в очереди работал один поток.
person
Rob Kennedy
schedule
02.09.2012