EvtSubscribe и нить - PullRequest
       3

EvtSubscribe и нить

0 голосов
/ 01 августа 2011

Я пытаюсь написать журнал для Windows.План прост - получить уведомление о событии, а затем записать его через сокет TCP. Этот пример MSDN показывает, что я должен использовать EvtSubscribe.Тем не менее, я не понимаю, как мне следует использовать дескриптор файла для открытого сокета TCP.Будет ли по умолчанию блокировать обратный вызов EvtSubscribe, или он будет работать в потоковом режиме или ...?

Заранее благодарен за любые советы, поэтому использование C ++ в Windows после C в Linux стало для меня проблемой

1 Ответ

1 голос
/ 01 августа 2011

Документы довольно скудны в деталях, но я считаю, что это работает следующим образом:

  • Если вы используете обратный вызов подписки, то он будет вызываться в выделенном потоке.Таким образом, если вы задержитесь в этом, он будет блокировать дальнейшие обратные вызовы, но не другой поток программы
  • . Если вы используете SignalEvent, он получит сигнал, когда придет событие, и никакие потоки не будут созданы автоматически.

Вы можете проверить, что это действительно другой поток, вызвав GetCurrentThreadId () из кода, который вызывает EvSubscribe (), и из обратного вызова, и сравните значения.

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

Что касается совместного использования сокета TCP, вы можете совместно использовать сокет между потоками, но вы не должны писатьк нему из более чем одного потока одновременно.Также не читайте.

Однако вы можете читать из одного потока и писать из другого.Также вы можете закрыть сокет из одного потока, в то время как другой находится в операции блокировки: он будет отменен.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...