EvtSubscribe和线程

时间:2011-08-01 16:33:36

标签: c++ windows multithreading winapi

我正在尝试为Windows转发日志。计划很简单 - 接收事件通知,然后通过TCP套接字写入。 This MSDN example表明我应该使用EvtSubscribe。但是,我对如何共享打开的TCP套接字的文件描述符感到困惑。 EvtSubscribe默认情况下会回调阻止,还是会线程或......?

提前感谢您提供任何提示,在Linux上使用C语言之后在Windows上选择C ++对我来说是一个挑战:)

1 个答案:

答案 0 :(得分:1)

文档的细节很少,但我认为它的工作原理如下:

  • 如果您使用订阅回调,则会在专用线程中调用它。所以,如果你延迟它,它将阻止进一步的回调,但不阻止程序的其他线程
  • 如果您使用SignalEvent,它将在事件到达时发出信号,并且不会自动创建任何线程。

您可以通过从调用EvSubscribe()和回调的代码中调用GetCurrentThreadId()来检查它是否是另一个线程,并比较这些值。

我的建议是使用线程选项,因为Windows中的事件处理程序很难正确编程。

关于共享TCP套接字,可以在线程之间共享套接字,但是不应该一次从多个线程写入它。也不读。

但是,您可以从一个线程读取并从另一个线程写入。此外,您可以从一个线程关闭套接字,而另一个线程处于阻塞操作中:它将被取消。

如果发现这种限制,您应该创建一个用户线程并使用它来发送和/或接收数据,同时与队列或类似的其他线程进行通信。