AfxBeginThread () + Cstring = мусор - PullRequest
       10

AfxBeginThread () + Cstring = мусор

0 голосов
/ 27 октября 2011

Пожалуйста, помогите мне понять, что не так с моим кодом.

Заголовочный файл

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 имеет правильное значение? Никто другой не изменяет адрес_сервера.

Спасибо за любые идеи.

1 Ответ

1 голос
/ 27 октября 2011

Ошибка в коде, который вы не вставили, сразу после 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;
}

Другие возможности включают сохранение объекта в области видимости до тех пор, пока вы не будете уверены, что поток завершен (если поток, создавший объект, может оставаться в той же области действия, пока поток объекта не будет завершен) и подсчет ссылок на объект, где поток содержит ссылку на объект.

...