2011-10-26 3 views
0

S'il vous plaît, aidez-moi à comprendre ce qui ne va pas avec mon code.AfxBeginThread() + Cstring = contenu de la poubelle

tête de fichier

typedef void (*pStatusCallback)(UINT code, const CString& message); 

class CComunicator 
{ 
private: 
    CUT_WSClient _client; 
    bool _shouldTerminate; 
    CString _serverAddress; 
    UINT _serverPort; 
    pStatusCallback _statusCallback; 

    UINT _ThreadFunc(); 
    static UINT ThreadFunc(LPVOID pParam); 
public: 
    CComunicator(const CString& serverAddress, UINT serverPort, pStatusCallback statusCallback); 
    ~CComunicator(void); 

    void Start(); 
    void Stop(); 
} 

Fichier source

CComunicator::CComunicator(const CString& serverAddress, UINT serverPort, pStatusCallback statusCallback) 
{ 
    _serverAddress = serverAddress; 
    _serverPort = serverPort; 
    _statusCallback = statusCallback; 
} 

CComunicator::~CComunicator(void) 
{ 
} 

void CComunicator::Start() 
{ 
    _shouldTerminate = false; 
    AfxBeginThread(CComunicator::ThreadFunc, this); 
} 

void CComunicator::Stop() 
{ 
    _shouldTerminate = true; 
} 

UINT CComunicator::ThreadFunc(LPVOID pParam) 
{ 
    return ((CComunicator*)pParam)->_ThreadFunc(); 
} 

UINT CComunicator::_ThreadFunc() 
{ 
    _statusCallback(0, _T("Connecting...")); 
    _client.Connect(_serverPort, _serverAddress); 
    _statusCallback(0, _T("Connected")); 

    // do here some work 


    _client.CloseConnection(); 

    return 0; 
} 

Utilisation

CComunicator com(_T("10.1.1.105"), 4502, ComunicatorCallback); 
com.Start(); 

Pourquoi méthode _ThreadFunc le _serverAddress contient des symboles de poubelle? _serverPort a la valeur correcte? Personne d'autre ne modifie le _serverAddress.

Merci pour vos idées.

+0

OMG, David vous avez raison, après cela est venu la fin de la méthode principale :) Donc, le programme a été achevé. THX! – Eugen

Répondre

1

Le bug est dans le code que vous n'avez pas collé, juste après com.Start();. Par exemple, si cette fonction renvoie, com est hors de portée, ce qui rend également la chaîne hors de portée. Au lieu de cela, faites ceci:

CComunicator *com=NEW CComunicator(_T("10.1.1.105"), 4502, CommunicatorCallback); 

com->Start(); 

Cela entraînera une fuite de mémoire, de sorte que vous devez delete com; lorsque vous avez terminé avec elle. La meilleure façon peut-être comme ceci:

UINT CComunicator::ThreadFunc(LPVOID pParam) 
{ 
    UNIT ret = ((CComunicator*)pParam)->_ThreadFunc(); 
    delete (CComunicator *)pParam; 
    return ret; 
} 

D'autres possibilités incluent garder l'objet de portée jusqu'à ce que vous êtes sûr que le fil est terminé (si le thread qui a créé l'objet peut rester dans ce même champ d'application jusqu'à ce que le fil de l'objet est fait) et référence comptant l'objet, où le thread de l'objet contient une référence à l'objet.