AfxBeginThread()+ Cstring =垃圾内容

时间:2011-10-26 21:01:06

标签: multithreading mfc 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。

感谢任何想法。

1 个答案:

答案 0 :(得分: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;
}

其他可能性包括将对象保留在范围内,直到您确定线程已终止(如果创建对象的线程可以保留在同一范围内直到对象的线程完成)并引用计数对象,其中对象是thread保存对象的引用。