程序的想法是在线程过程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);
答案 0 :(得分:3)
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);
答案 1 :(得分:1)
实际上,
WaitForSingleObjectEx(&m_hThreadSignalEvent, INFINITE, false);
应该是
WaitForSingleObjectEx(*m_hThreadSignalEvent, INFINITE, false);
我还要补充一点,您的示例根本不需要使用HANDLE
指针(HANDLE *)
。