EvtSubscribe and threading

EvtSubscribe and threading

本文关键字:threading and EvtSubscribe      更新时间:2023-10-16

我正在尝试写一个日志转发给Windows。这个计划很简单——接收一个事件通知,然后通过TCP套接字写入它。这个MSDN示例显示我应该使用EvtSubscribe。但是,我对如何为打开的TCP套接字共享文件描述符感到困惑。是否EvtSubscribe回调块默认情况下,它将线程或…?

提前感谢您的任何提示,在Linux上使用C之后,在Windows上学习c++对我来说有点挑战:)

文档在细节上相当稀疏,但我认为它的工作方式如下:

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

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

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

关于共享TCP套接字,您可以在线程之间共享套接字,但是您不应该同时从多个线程写入它。也不读。然而,你可以从一个线程读,从另一个线程写。另外,当另一个线程正在阻塞操作时,您可以从一个线程关闭套接字:它将被取消。

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