2011-10-26 52 views
0

請幫我理解我的代碼有什麼問題。AfxBeginThread()+ Cstring =垃圾內容

頭文件

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(); 
} 

源文件

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

使用

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

爲什麼在方法_ThreadFunc _serverAddress包含垃圾郵件符號? _serverPort具有正確的值? 沒有人正在改變_serverAddress。

Thx任何想法。

+0

OMG,大衛你是對的,之後纔剛到主方法結束:)所以程序就完成了。謝謝! – Eugen

回答

1

這個錯誤是在你沒有粘貼的代碼中,在com.Start();之後。例如,如果該函數返回,則com超出作用域,並且超出作用域。相反,這樣做:

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

com->Start(); 

這將導致內存泄漏,所以你需要delete com;當你用它做。最好的辦法可能是這樣的:

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

其他可能性包括保持在範圍內的對象,直到你確定線程終止(如果創建該對象的線程可以保持在相同的範圍內,直到該對象的線程完成)並引用計數對象,其中對象的線程保存對該對象的引用。