C++ 需要通过引用类来传递Windows事件句柄的帮助吗
程序的思想是在线程过程Setxxx()中运行一个循环,并在循环结束时等待一个事件。一旦触发事件,循环将恢复 此Setxxx()函数位于类中,其调用方创建事件、线程并将事件传递给类构造函数 我想如果我传入一个指向句柄的指针,我可以调用ResetEvent来解除线程阻塞。但问题是WaitForSingleObjectEx函数返回w/out waiting。其返回代码为6(DWORD)无效句柄 如何传入句柄,以便通过ResetEvent解除阻止来控制线程C++ 需要通过引用类来传递Windows事件句柄的帮助吗,c++,windows,multithreading,winapi,C++,Windows,Multithreading,Winapi,程序的思想是在线程过程Setxxx()中运行一个循环,并在循环结束时等待一个事件。一旦触发事件,循环将恢复 此Setxxx()函数位于类中,其调用方创建事件、线程并将事件传递给类构造函数 我想如果我传入一个指向句柄的指针,我可以调用ResetEvent来解除线程阻塞。但问题是WaitForSingleObjectEx函数返回w/out waiting。其返回代码为6(DWORD)无效句柄 如何传入句柄,以便通过ResetEvent解除阻止来控制线程 // header file class CP
// 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
是一个句柄*
,因此需要取消对它的引用。您需要将代码更改为:
ResetEvent(*m_hThreadSignalEvent);
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
// 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);
然而,您的CPropertyMarker
构造函数也很奇怪,因为它需要句柄**
,并取消对它的引用以获得句柄*
,这几乎肯定是不正确的。你似乎有太多的间接层次。HANDLE
本身就是一个指针,您很少需要在任何地方使用HANDLE*
我将考虑将您的代码更改为:
ResetEvent(*m_hThreadSignalEvent);
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
// 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);
m_hThreadSignalEvent
是一个句柄*
,因此需要取消对它的引用。您需要将代码更改为:
ResetEvent(*m_hThreadSignalEvent);
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
// 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);
然而,您的CPropertyMarker
构造函数也很奇怪,因为它需要句柄**
,并取消对它的引用以获得句柄*
,这几乎肯定是不正确的。你似乎有太多的间接层次。HANDLE
本身就是一个指针,您很少需要在任何地方使用HANDLE*
我将考虑将您的代码更改为:
ResetEvent(*m_hThreadSignalEvent);
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
// 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*)
实际上
WaitForSingleObjectEx(&m_hThreadSignalEvent, INFINITE, false);
应该是
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
我还要补充一点,您的示例根本不需要使用
HANDLE
指针(HANDLE*)
你太努力了。您只需通过值传递HANDLE
s即可。在引擎盖下,一个手柄
被声明为无效*
,所以实际上只是一个吊舱。你太努力了。您只需通过值传递HANDLE
s即可。在引擎盖下,一个手柄
被声明为无效*
,所以实际上只是一个吊舱。啊,我正要键入一个应该删除的间接级别。不要忘记更改m\u hEventMainThread=(HANDLE)CreateEvent(…)
.Perfect。非常感谢。指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针。不要忘记更改m\u hEventMainThread=(HANDLE)CreateEvent(…)
.Perfect。非常感谢。指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针。