在我的一个类的构造函数中,我将 Windows 函数CreateThread
称为最后一个操作。创建线程以立即执行,我将我的类的 this 指针作为lpParameter
.
在线程过程中,我将传递回的参数转换为我的类的指针并命名它pThis
。
我可以看到它pThis
指向与我调用时传递的指针相同的内存位置。但是,如果我查看它们访问的成员变量,它们都有错误的值。this
CreateThread
pThis->...
我希望this->member_variable
this 指针所属的类中 used 的值与我在编写pThis->member_variable
线程过程时得到的值相同。
如果我调用CreateThread
另一个成员函数(而不是构造函数),一切都会正常运行。
CreateThread
因此问题是:是否禁止从 C++ 类的构造函数中调用 Windows 函数?如果是,问题是什么?
澄清:
1)我可以确认该对象始终存在。只有当整个程序结束时,对象才会超出范围。正如我已经说过的:CreateThread
从其他一些成员函数调用确实有效。
2) 更正了“有线”错字,应该是“奇怪”,抱歉。
一些代码:
我尝试发布代码片段,将事情减少到最低限度,同时保持“故障”部分。
class CTimerW32 : public CTimer
{
public:
CTimerW32();
~CTimerW32();
private:
static void CALLBACK TimerCallback(LPVOID lpParam, BOOLEAN bReason);
static DWORD WINAPI WaitCompletition(LPVOID lpParam);
private:
HANDLE m_hCompletitionEvent;
HANDLE m_hCompletitionThread;
bool m_bStartDeferred;
};
您可以放心地忽略基类CTimer
,因为它只是一个抽象基类,可以在不同平台上构建。
CTimerW32::CTimerW32()
{
m_bStartDeferred= false;
m_hCompletitionEvent= CreateEvent(NULL, FALSE, FALSE, NULL);
m_hCompletitionThread= CreateThread(NULL, 0, WaitCompletition, this, 0, NULL);
}
在这里我可以看到m_hCompletitionEvent
在调用CreateEvent
.
DWORD WINAPI CTimerW32::WaitCompletition(LPVOID lpParam)
{
CTimerW32* pThis;
DWORD dwRet;
pThis= (CTimerW32*)(lpParam);
while (true) {
// just wait for the completition event to be signaled
dwRet= WaitForSingleObject(pThis->m_hCompletitionEvent, INFINITE);
// ...
if (pThis->m_bStartDeferred) {
// ...
}
}
调用WaitForSingleObject
. 如前所述,类对象的 this 指针CTimerW32
(现在pThis
)在线程创建期间仍然具有与 this 指针相同的值。然而,其中的句柄pThis->m_hCompletitionEvent
似乎是随机数据。它不是CreateEvent
在构造函数中调用后观察到的值。