[英]C++ Exception or passing arguments to thread
我正在尝试使用CreateThread()
将结构传递给我的线程,这是我的结构:
struct Secure
{
int UID;
LPVOID MainClass;
};
这是我调用CreateThread()
Secure m_Secure = {Room->g_User[PlayerNumber].UID,this};
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,&m_Secure,NULL,NULL);
其中第一个是整数,第二个是指向当前类的指针。
而且,这是我的主题,我认为这是问题所在
HRESULT WINAPI SecureThread(LPVOID Param)
{
int UID = -1, UserNumber, i;
Secure* m_Secure = (Secure*)Param;
UID = m_Secure->UID;
CGGCBotDlg *h_MainClass = (CGGCBotDlg*)m_Secure->MainClass;
if (UID == -1) return 0;
Sleep(25000);
for (i = 0; i < TOTAL_CLIENTS; i++)
{
if (h_MainClass->Room->g_User[i].UID == UID)
{
UserNumber = i;
break;
}
}
if( h_MainClass->Room->g_User[UserNumber].IsFree == false && h_MainClass->Room->g_User[UserNumber].Secured == false)
h_MainClass->Room->Kick(h_MainClass->Room->g_User[UserNumber].UID,"Didn't Authorized");
return 0;
}
当创建此线程时,程序崩溃,这是例外:
First-chance exception at 0x00EC3548 in GGCRoomServer.exe: 0xC0000005: Access violation reading location 0x5D00009C.
Unhandled exception at 0x00EC3548 in GGCRoomServer.exe: 0xC0000005: Access violation reading location 0x5D00009C.
创建一个堆变量来保存数据并将其传递给线程。
Secure * m_Secure = new Secure();
m_Secure->UID = g_User[PlayerNumber].UID;
m_Secure->MainClass = this;
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,m_Secure,NULL,NULL);
获取线程中的数据,并在完成后删除
RESULT WINAPI SecureThread(LPVOID Param)
{
int UID = -1, UserNumber, i;
Secure* m_Secure = (Secure*)Param;
....
delete m_Secure;
return 0;
}
看起来你在这里将一个局部变量的地址传递给一个线程
Secure m_Secure = {Room->g_User[PlayerNumber].UID,this};
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,&m_Secure,NULL,NULL);
作为局部变量, m_Secure
将超出范围,并在函数完成执行后被销毁。 此外,m_Secure很可能是在堆栈上创建的。 将一个线程的堆栈变量地址传递给另一个是一个坏主意
您需要在堆上创建变量
就像是
CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecureThread,new Secure(...),NULL,NULL);
^^^^^^^^^^^^^^
并且不要忘记之后删除指针
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.