Что быстрее: SetEvent, SendMessage, PostMessage - PullRequest
1 голос
/ 04 августа 2009

Среда: Win32, C / C ++

Все три (3) могут использоваться для потока, чтобы сообщить main (), что он, например, завершил операцию.

Но какой из них самый быстрый из всех?

Хмм ...

Ответы [ 4 ]

6 голосов
/ 04 августа 2009

Все три параметра требуют переключения контекста потока, чтобы фактически сигнализировать принимающему потоку. Вполне вероятно, что издержки переключения контекста сократят любую разницу в стоимости обработки в любом из API.

Выбор, вероятно, лучше всего определяется характером принимающего потока, например, это поток пользовательского интерфейса, и / или выполняет ли он цикл сообщений. Тем не менее, некоторые мелкие детали включают в себя:

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

  • PostMessage также полезно, когда получатель находится в цикле сообщений. Отличие от SendMessage заключается в том, что он не ждет, пока получатель обработает сообщение, что приводит к меньшим накладным расходам.

  • SetEvent полезно, когда принимающий поток может ожидать объект события, например, с WaitForSingleObject (). Он не требует маршалинга или обработки сообщений и, скорее всего, будет реагировать быстрее, чем другие.

2 голосов
/ 04 августа 2009

SetEvent, безусловно, самый быстрый и простой, но он также может нести наименьшую информацию. По сути, все, что можно сказать, это то, что что-то произошло (событие было сигнализировано) и ничего более.

0 голосов
/ 05 августа 2009

Если вы посмотрите на MsgWaitForMultipleObjects против WaitForMultipleObjects, вы увидите, что максимальное количество объектов ожидания для MsgWaitForMultipleObjects на единицу меньше, чем WaitForMultipleObjects, означающее, что имеется скрытое «событие сообщения», поэтому сообщение будет содержать служебную информацию события + сообщение прохождение

0 голосов
/ 04 августа 2009

Не проверял, но (при условии, что кто-то ожидает объект), я бы сказал SetEvent, SendMessage и, наконец, PostMessage.

Редактировать: Причина вышеизложенного заключается в том, что SendMessage является синхронным, а PostMessage асинхронным. Я не уверен насчет SetEvent, но я бы предположил, что он вызовет что-то, ожидающее событие, не дожидаясь, пока насос сообщений доставит сообщение. Думать об отправке или публикации, вероятно, не имеет значения, это просто вопрос, будет ли отправляющая сторона ждать или нет. Внутренняя обработка, вероятно, идентична.

Однако ни отправка, ни отправка сообщения, как правило, не используются для отправки сигнала в другой поток.

...