如何在进程之间共享内核对象,例如可等待计时器
How to share kernel objects, such as Waitable Timers, between processes?
我正在创建一个对象,例如一个可等待的计时器,我想与另一个进程共享我的对象:
// In process 1:
HANDLE hTimerProcess1 = CreateWaitableTimer(NULL, FALSE, L"Time1");
// In process 2:
HANDLE hTimerProcess2 = CreateWaitableTimer(NULL, FALSE, L"Time1");
- 作为第三个参数,我传递相同的名称
"Time1"
,这是否意味着我正在创建一个新的内核对象hTimerProcess2
但具有与hTimerProcess1
相同的描述符表条目,或者hTimerProcess2
只是对现有对象的引用(hTimerProcess1
)? - 如何证明
hTimerProcess1
和hTimerProcess2
是同一个内核对象?我尝试获取他们的地址,但他们是不同的。
我正在阅读 M. Richter 的"高级 Win32 编程"
从文档到CreateWaitableTimer
:
如果命名计时器对象在函数调用之前存在,则 函数返回现有对象的句柄和 GetLastError 返回ERROR_ALREADY_EXISTS。
所以你的问题 #1 的答案是否定的,你没有创建一个新的内核对象 - 如果两个调用都成功,它们将引用同一个计时器。
如何证明它们是相同的?您可以通过在一个进程中调用SetWaitableTimer
并在另一个进程中等待它来做到这一点。
如果要额外确保在第二个进程中获取相同的计时器对象,请改为调用OpenWaitableTimer
- 因为这仅在计时器已存在时才成功。
根据 CreateWaitableTimer 的描述,这是可能的:
如果函数成功,则返回值是计时器对象的句柄。如果命名的计时器对象在函数调用之前存在,则该函数将返回现有对象的句柄,并且 GetLastError 返回ERROR_ALREADY_EXISTS。
因此,您应该检查句柄的值(而不是地址)和GetLastError()
的结果,以查看您的实现是否成功。
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 设置可等待计时器和夏令时调整
- 等待计时器不等待指定的时间段
- 我可以通过其句柄判断可等待计时器何时会触发
- 如何在进程之间共享内核对象,例如可等待计时器
- C++计时器(等待一段时间)
- 如何无限期推迟可等待计时器
- 仅使用标准库实现等待计时器
- 用户计时器在第一次使用后出错,无论我等待多长时间都会返回零