2011-10-26 5 views
0

제 코드가 잘못되었음을 이해시켜주세요.AfxBeginThread() + Cstring = garbage content

헤더 파일

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

다른 가능성이 범위에서 개체를 유지 포함 작업이 완료 됨) 및 객체를 참조하는 참조가 발생합니다. 여기서 객체의 스레드는 객체에 대한 참조를 보유합니다.