需要通过引用类传递Windows事件句柄的帮助
Need help passing Windows Event HANDLE by reference to a class
程序的想法是在线程过程Setxxx()中运行一个循环,在循环结束时等待一个事件。一旦事件触发,循环将继续。
这个Setxxx()函数在一个类中,它的调用者创建事件、线程并将事件传递给类构造函数。
我想,如果我传递一个指向HANDLE的指针,我可以调用ResetEvent来解锁线程。但问题是WaitForSingleObjectEx函数返回w/out等待。它的返回代码是6(DWORD)无效句柄。
如何传入句柄,以便通过使用ResetEvent取消阻止来控制线程?
// header file
class CPropertyMarker {
public:
CPropertyMarker(HANDLE **hThreadSignalEvent);
void Setxxx();
private:
bool m_Run;
HANDLE* m_hThreadSignalEvent;
};
// class file
CPropertyMarker::CPropertyMarker(HANDLE **hThreadSignalEvent) {
m_hThreadSignalEvent = *hThreadSignalEvent;
}
void CPropertyMarker::Setxxx() {
DWORD retVal = 0;
while(m_Run) {
try {
// statements snipped
}
catch(exception){}
ResetEvent(m_hThreadSignalEvent);
WaitForSingleObjectEx(&m_hThreadSignalEvent, INFINITE, false);
}
}
// caller
m_hEventMainThread = (HANDLE*)CreateEvent(NULL, true, true, L"xxx-adsfsdfblah_yyy");
m_PropMarker = new CPropertyMarker(&m_hEventMainThread);
m_PropMarker->SetRunState(true);
m_hThreadMain = CreateThread(NULL, 0, &CFromMyClass::Setxxx, (LPVOID)m_PropMarker, 0, &m_ThreadMainId);
m_hThreadSignalEvent
是HANDLE*
,因此您需要取消引用它。您需要将代码更改为:
ResetEvent(*m_hThreadSignalEvent);
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
然而,您的CPropertyMarker
构造函数也很奇怪,因为它使用HANDLE**
,并取消引用它以获得HANDLE*
,这几乎肯定是不正确的。你似乎有太多的间接性。HANDLE
本身就是一个指针,您很少需要在任何地方使用HANDLE*
。
我会考虑将您的代码更改为:
// header file
class CPropertyMarker {
public:
CPropertyMarker(HANDLE hThreadSignalEvent);
void Setxxx();
private:
bool m_Run;
HANDLE m_hThreadSignalEvent;
};
// class file
CPropertyMarker::CPropertyMarker(HANDLE hThreadSignalEvent) {
m_hThreadSignalEvent = hThreadSignalEvent;
}
void CPropertyMarker::Setxxx() {
DWORD retVal = 0;
while(m_Run) {
try {
// statements snipped
}
catch(exception){}
ResetEvent(m_hThreadSignalEvent);
WaitForSingleObjectEx(m_hThreadSignalEvent, INFINITE, false);
}
}
// caller
m_hEventMainThread = CreateEvent(NULL, true, true, L"xxx-adsfsdfblah_yyy");
m_PropMarker = new CPropertyMarker(m_hEventMainThread);
实际上,
WaitForSingleObjectEx(&m_hThreadSignalEvent, INFINITE, false);
应该是
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
我还要补充一点,您的示例根本不需要使用HANDLE
指针(HANDLE *)
。
相关文章:
- Windows 进程间同步类似事件?
- 如何实现从 Windows 脚本主机到脚本的事件调度
- 具有多个 OR 的 Xpath 查询不适用于 Windows 事件
- 如何从Qt绑定到在Windows 7 / 8 / 10中连接/断开USB设备事件
- Windows 在 C++ 中锁定和解锁事件
- Windows:基于事件的重叠 IO 与 IO 完成端口,实际性能
- Windows Console API鼠标事件只是进入选择模式
- (如何)我可以在Windows上模拟触摸事件吗?
- QCoreApplication事件循环和Windows服务控制处理程序功能
- 运行Qt 5.10事件循环howto的Windows服务service_WIN32_OWN_PROCESS
- 如何将Windows事件日志刷新到磁盘
- 为什么我的Windows控制台关闭事件处理程序超时
- Windows C++ UWP:等待 XX 毫秒,直到事件发生
- 如何在 Windows 上的C++控制台应用程序中捕获 ctrl-c 事件,而不会进入无限循环
- 如何在Windows 8中以编程方式触发鼠标和键盘事件
- 一个客户一次收到Windows事件
- 将CTRL C事件发送到使用Windows上使用Qprocess启动的过程
- 注册以在 MFC 中发出 Win32 事件信号时接收 Windows 消息
- 尝试实现 Windows API 包装器的事件处理程序时遇到问题
- 强制触发键关闭事件 (Windows)