需要帮助通过引用类传递Windows事件处理

时间:2015-11-17 23:38:10

标签: c++ windows multithreading winapi

程序的想法是在线程过程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); 

2 个答案:

答案 0 :(得分:3)

m_hThreadSignalEventHANDLE*,因此您需要取消引用它。您需要将代码更改为:

   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 *)