簡體   English   中英

C ++異常或將參數傳遞給線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM