многопоточность — исключение C ++ или передача аргументов потоку

Я пытаюсь передать структуру в мой поток, используя 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.

1

Решение

Создайте переменную кучи для хранения ваших данных и передайте их потоку.

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;
}
2

Другие решения

Похоже, вы передаете адрес локальной переменной в поток здесь

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);
^^^^^^^^^^^^^^

И не забудьте потом удалить указатель

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector