Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要通过引用类来传递Windows事件句柄的帮助吗_C++_Windows_Multithreading_Winapi - Fatal编程技术网

C++ 需要通过引用类来传递Windows事件句柄的帮助吗

C++ 需要通过引用类来传递Windows事件句柄的帮助吗,c++,windows,multithreading,winapi,C++,Windows,Multithreading,Winapi,程序的思想是在线程过程Setxxx()中运行一个循环,并在循环结束时等待一个事件。一旦触发事件,循环将恢复 此Setxxx()函数位于类中,其调用方创建事件、线程并将事件传递给类构造函数 我想如果我传入一个指向句柄的指针,我可以调用ResetEvent来解除线程阻塞。但问题是WaitForSingleObjectEx函数返回w/out waiting。其返回代码为6(DWORD)无效句柄 如何传入句柄,以便通过ResetEvent解除阻止来控制线程 // header file class CP

程序的思想是在线程过程Setxxx()中运行一个循环,并在循环结束时等待一个事件。一旦触发事件,循环将恢复

此Setxxx()函数位于类中,其调用方创建事件、线程并将事件传递给类构造函数

我想如果我传入一个指向句柄的指针,我可以调用ResetEvent来解除线程阻塞。但问题是WaitForSingleObjectEx函数返回w/out waiting。其返回代码为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
是一个
句柄*
,因此需要取消对它的引用。您需要将代码更改为:

   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。非常感谢。指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针指针。