gpt4 book ai didi

c++ - 需要帮助通过引用类传递 Windows 事件句柄

转载 作者:行者123 更新时间:2023-11-27 22:55:14 25 4
gpt4 key购买 nike

程序思路是在线程过程 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);

关于c++ - 需要帮助通过引用类传递 Windows 事件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33769168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com