В Delphi, что фактически делают System.TMonitor.Pulse и TMonitor.PulseAll - PullRequest
11 голосов
/ 29 августа 2011

Мне было очень приятно видеть, что Delphi представила запись TMonitor в Delphi 2009, позволяющую вам блокировать определенные объекты в многопоточной среде. Что меня озадачило, так это методы Pulse и PulseAll этого типа записи.

Например, запись для Pulse в справке Delphi гласит: «Уведомляет следующий поток в очереди ожидания, что он сможет заблокировать указанный объект, как только вызывающий поток освободит объект».

В самом деле? Что это значит? Я использовал TMonitor без использования Pulse без проблем. Кроме того, некоторые из применений TMonitor в источнике Delphi никогда не используют Pulse.

Включены ли методы Pulse и PulseAll в запись TMonitor Delphi только для совместимости на уровне источника с классом .NET Monitor или они действительно служат определенной цели?

Есть два вопроса ( "TMonitor.Pulse vs TMonitor.PulseAll" и "Что такое TMonitor в модуле Delphi System для" ), которые говорят об этой проблеме, но я ищу окончательный ответ.

1 Ответ

4 голосов
/ 29 августа 2011

Ссылка на Википедию в моем ответе на упомянутый вопрос содержит обсуждение использования функции ожидания / импульса / импульса на мониторе. Поток должен войти в монитор их ожидания вызова. Затем другой поток должен войти в монитор и вызвать импульс или импульсный сигнал, чтобы подать сигнал первому ожидающему потоку. Pulse сигнализирует только об одном ожидающем потоке, тогда как pulseall сигнализирует обо всех ожидающих потоках. Посмотрите на раздел условных переменных статьи в Википедии для более подробного обсуждения. В источнике RTL есть также комментарии, описывающие методы TMonitor.

...