Заставить другую нить спать - PullRequest
2 голосов
/ 29 июня 2009

Итак, у меня есть программа, которая служит своего рода «оболочкой» для других программ. По своей сути он получает класс, имя метода и некоторые аргументы и управляет выполнением функции, чтобы позволить другим программистам планировать выполнение своих процессов в этом сервисе оболочки. Все работает отлично, за исключением одного вопроса. Часто эти процессы, которые запланированы для выполнения, очень загружены процессором. Время от времени вызываемые процессы начинают использовать так много ЦП, что у моих потоков, которые отвечают за проверку расписаний и запуск других заданий, нет возможности запускаться в течение достаточно долгого времени, что приводит к проблемам планирования и недостаточная отзывчивость. К сожалению, я не могу вставить вызовы Thread.Sleep () в реально работающий код, так как на самом деле он мне не принадлежит.

Итак, мой вопрос: возможно ли заставить произвольный поток (который я начал) спать (выходить) так часто, не изменяя фактический код, выполняющийся в этом потоке? Кроме этого, есть ли какой-нибудь способ «вставить» вызовы Thread.Sleep () в код, который я собираюсь запустить динамически во время выполнения?

Ответы [ 5 ]

10 голосов
/ 29 июня 2009

Не совсем. Вы можете попробовать изменить приоритет другого потока с помощью свойства Priority, но на самом деле вы не можете ввести "спящий" вызов.

Есть Thread.Suspend(), но я настоятельно рекомендую не использовать его. Вы на самом деле не хотите, чтобы заставлял другой поток приостанавливаться в произвольные моменты времени, поскольку он может содержать важные ресурсы. (Вот почему метод помечен как устаревший и содержит все виды предупреждений:)

Уменьшение приоритета других задач и потенциальное повышение приоритета ваших собственных задач, вероятно, является наилучшим подходом.

4 голосов
/ 29 июня 2009

Нет, нет (насколько мне известно), однако вы можете изменить приоритет планирования потока - http://msdn.microsoft.com/en-us/library/system.threading.thread.priority.aspx.

Понижение приоритета потока, в котором выполняется код проблемы, при запуске потока (или повышение приоритета потоков планирования)

1 голос
/ 29 июня 2009

Вы можете приостановить поток с помощью Thread.Suspend (устарело и не рекомендуется), или вы можете уменьшить его приоритет, изменив Thread.Priority .

0 голосов
/ 29 июня 2009

Ты не должен этим заниматься. Потоки не должны Sleep (), если они сами не решат, что это хорошая идея.

В любом случае это не относится к вашей проблеме. Ваша проблема, очевидно, в том, что потоки управления не запускаются из-за нехватки ресурсов процессора. Чтобы это исправить, достаточно дать этим потокам более высокий приоритет. В конце каждого временного интервала ОС будет определять, какие потоки должны запускаться дальше. Приоритет потока несколько динамичен: потоки, которые не запускались некоторое время, будут перемещаться вверх по сравнению с только что запущенным потоком Но более высокий приоритет базовых потоков для ваших потоков управления будет означать, что им не нужно это динамическое повышение для планирования.

Если этого по-прежнему недостаточно, уменьшите приоритет рабочих потоков. Это будет означать, что рабочий поток должен бездействовать еще больше времени, прежде чем он получит новый временной интервал.

Наконец, убедитесь, что поток, запускающий новые рабочие потоки, работает с очень низким приоритетом. Это будет означать, что новые потоки не создаются, если система выходит за пределы загрузки ЦП. Это реализует простой, но надежный механизм регулирования.

0 голосов
/ 29 июня 2009

На самом деле, то, что вы заявляете, представляет собой серьезную угрозу безопасности и, следовательно, не будет поддерживаться большинством платформ. Как правило, не разрешается, чтобы другие программы влияли на ваш статус без вашего разрешения.

Если возможно, вы, вероятно, можете загрузить соответствующую прогу в отдельный процесс, который вы создаете в своем коде, и затем вы можете установить приоритет этого процесса или сделать его спящим, или что у вас есть. Я не эксперт в программировании Windows, поэтому ваш пробег может отличаться.

...