在我的一个类的构造函数中,我将 Windows 函数CreateThread称为最后一个操作。创建线程以立即执行,我将我的类的 this 指针作为lpParameter.
在线程过程中,我将传递回的参数转换为我的类的指针并命名它pThis。
我可以看到它pThis指向与我调用时传递的指针相同的内存位置。但是,如果我查看它们访问的成员变量,它们都有错误的值。thisCreateThreadpThis->...
我希望this->member_variablethis 指针所属的类中 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在构造函数中调用后观察到的值。