c ++ - Send en variabel på bunken til en anden tråd

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et mærkeligt problem i C ++. En booles adresse bliver 'ødelagt', men det bliver ikke rørt. Jeg ved, at der er bedre måder at opnå, hvad jeg forsøger at gøre, men jeg vil gerne vide, hvad jeg gør forkert.


Jeg har en hovedklasse denne hovedklasse indeholder en vektor af en anden klasse. Der er et mærkeligt problem, når der oprettes en ny forekomst af dette objekt.


Sådan fungerer min kode:


Der vil startes en tråd, når konstruktøren bliver kaldt af '2.' objektet. Denne tråd får som parameter en struktur. Dette er strukturen:


struct KeyPressData
{
    vector<bool> *AutoPressStatus;
    vector<int> *AutoPressTime;
    bool * Destroy;
    bool * Ready;
};


Strukturen bliver fyldt i konstruktøren:


MultiBoxClient::MultiBoxClient()
{
    //init data
    DestroyThread = new bool;
    ReadyThread = new bool;
    AutoThreadData = new KeyPressData;  

    //Reseting data
    *DestroyThread = false;
    *ReadyThread = false;   

    //KeyPressData configurating
    AutoThreadData->AutoPressStatus = &AutoPressStatus;
    AutoThreadData->AutoPressTime = &AutoPressTime;
    AutoThreadData->Destroy = DestroyThread;
    AutoThreadData->Ready = ReadyThread;

    //Start the keypress thread
    CreateThread(NULL,NULL,(LPTHREAD\_START\_ROUTINE)AutoKeyThread,AutoThreadData,NULL,NULL); 
}


Dette er defenitionen af ​​MultiBoxClient:


class MultiBoxClient
{
    private:
        HWND ClientHandle;                                  
        vector<bool> KeyPresses;                                

        vector<bool> AutoPressStatus;                           
        vector<int> AutoPressTime;                              

        KeyPressData * AutoThreadData;                          

        bool * DestroyThread;                                       
        bool * ReadyThread;                                     

    public:
        MultiBoxClient();
        MultiBoxClient(HWND Handle);                            
        ~MultiBoxClient();                                      

        void EditClient(HWND Handle);                           

        void SendKeypress(vector<bool> KeyStatus);              
        void SendKeyCombination(unsigned int id);               
        void AutoCast(int Key,unsigned int Time,bool status);   

        bool IsAlive();                                         

};


MultiBoxClient er oprettet på denne måde:


int main()
{
    MultiboxControler * MainControler = new MultiboxControler;

    while(true)
    {
        Sleep(1000);
    }

    delete MainControler;

    return false;
}


Så længe konstruktøren kører vil programmet køre fint. Men når konstruktøren lukker adressen til AutoThreadData->Destroy vil blive beskadiget. Programmet vil gå ned, når jeg ringer markørens værdi.




void WINAPI AutoKeyThread(void * ThreadData)
{

    KeyPressData * AutoThreadData = (KeyPressData*)ThreadData;

    while(true)
    {   
        if(*AutoThreadData->Destroy == true)    //CRASH
        {
            *AutoThreadData->Ready = true;
            return;
        }
        Sleep(100);
    }
}


Hvad har jeg testet:


Jeg loggede adressen til AutoThreadData og AutoThreadData->Destroy, når constrcutor kører og klosset; AutoThreadData -adressen er lig med AutoThreadData, når konstruktøren er lukket. Så der er ikke noget problem her.


Adressen til AutoThreadData->Destroy bliver ødelagt, når konstruktøren er lukket. Men hvordan kan det ske? Den boolske er på bunken, og KeyPressData struct (AutoThreadData) ligger på bunken.


Destroy before: 00A85328
Destroy after: FEEEFEEE


Kan nogen maby forklare hvorfor dette sammenbrud?


Jeg ved, at jeg kan sende en pointer til min klasse til tråden. Men jeg vil gerne vide, hvad der går galt her. På den måde kan jeg lære af mine fejl.


Kan nogen hjælpe mig med dette problem?

Bedste reference


Jeg gætter på, at du har lavet en fejl med vektoren, brug en klassepekner i stedet for selve klassen som sådan:


vector<class*> //instead of vector<class>

Andre referencer 1


0xFEEEFEEE er en indikation på frigjort hukommelse. Det er, du AutoThreadData blev slettet, og det var ikke på din arbejdstråd, som er i endeløs sløjfe. Så det skal være din hovedtråd og måske destructor, som du ikke viste.


Hvor du ødelægger/frigør dit KeyPressData eksempel, kommentere det her eller sæt et breakpoint der for at finde ud af, hvor det foregår.