2010-05-12 5 views
3

I ont trois classes:C++ cela comme paramètre fil, les variables non disponibles

class Rtss_Generator { 
    int mv_transfersize; 
} 
class Rtss_GenSine : Rtss_Generator 
class Rtss_GenSineRpm : Rtss_GenSine 

Rtss_GenSine crée un fil dans son constructer, on commence immédiatement et le ThreadFunction est hors cours déclarée statique, en attendant un événement commencer à calculer.

le problème: toutes les variables qui sont accessibles par le gen-pointeur sont 0, mais il ne manque pas. De plus, cette adresse dans le constructeur et l'adresse gen-pointer dans le thread sont les mêmes, donc le pointeur est ok.

ce code est créé et compiler dans Visual Studio 6.0 Service Pack 2003

CODE ORIGINAL

no thread 

Rtss_GenSine::getNextData() { 
    //[CALCULATION] 
    //mv_transferSize is accessible and has ALWAYS value 1600 which is ok 
} 

CODE NOUVEAU

Rtss_GenSine::Rtss_GenSine() { 
    createThread(NULL, threadFunction, (LPVOID) this,0,0); 
} 

Rtss_GenSine::getNextData() { 
    SetEvent(startCalculating); 


    WaitForSingleObject(stoppedCalculaing, INFINITE); 
} 

DWORD Rtss_GenSine::threadFunction(LPVOID pParam) { 
    Rtss_GenSine* gen = (Rtss_GenSine*) pParam; 

    while(runThread) { 
     WaitForSingleObject(startCalculating, INFINITE); 
     ResetEvent(startCalculating) 

     //[CALCULATION] 
     //gen->mv_transferSize ---> it does not fail, but is always zero 
     //all variables accessed via the gen-pointer are 0 

     setEvent(stoppedCalculaing) 
    } 
} 
+0

Je pense que vous devriez mettre à jour le compilateur, et il semble que votre routine "createThread" n'est pas celle de WinAPI. Voir la documentation CreateThread sur MSDN. – SigTerm

Répondre

2

que tu fais peut-être, quelque chose comme ceci:

Rtss_GenSize someFunc() 
{ 
    Rtss_GenSize temp; 
    return temp; 
} 

Rtss_GenSine mygensize = some_func(); 

Dans ce cas, le constructeur est appelé une fois, sur une instance temporaire, le constructeur de copie appelé pour le copier dans mygensize (deux fois), rendant 'this' non bon pour le thread engendré.

Cela pourrait être le problème ... le code qui crée l'instance du Rtss_GenSine contribuerait à l'enquête si vous publiez ...

+0

ce n'est pas le cas, le constructeur est joliment appelé une fois avec new. Le code d'origine fonctionne parfaitement. – brecht

+0

Juste un tir dans le noir - difficile à deviner sans plus de code affiché. Une autre supposition ci-dessous ... – paquetp

+0

Il est maintenant résolu, je ne devrais pas créer de thread dans le constructeur, ce pointeur n'est pas complètement initialisé. Le problème est stupide: le compilateur ne se plaint pas, mais il sera toujours inutilisable. – brecht

0

Voici une autre supposition - une condition de course, l'initialisation de votre startCalculating mutex ne pas être le propriétaire, et mv_transferSize initialisé après le constructeur, mais avant l'appel à getNextData ...

Questions connexes