【问题标题】:AfxBeginThread() + Cstring = garbage contentAfxBeginThread() + Cstring = 垃圾内容
【发布时间】:2011-10-26 21:01:06
【问题描述】:

请帮助我了解我的代码有什么问题。

头文件

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。

感谢任何想法。

【问题讨论】:

  • 天啊,大卫,你是对的,在那之后才刚刚结束 main 方法:) 所以程序完成了。谢谢!

标签: multithreading mfc cstring


【解决方案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;
}

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

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多