2011-09-13 19 views
0

スレッドで実行時エラーが発生しました。エラーは "clientCheck.exeの0x0043e98eで処理されない例外:0xC0000005:0x025042c4の場所を読み取るアクセス違反"です。C++のスレッドでランタイムエラーが発生しました

//create thread in cpp file 
     CreateThread(NULL,0,stayConnectedAtClient,this,0,NULL); 
     //thread definition in header file 
     static unsigned long __stdcall stayConnectedAtClient(void *i_socketTransPortClient){ 
        ((SocketTransportClient*)i_socketTransPortClient)->stayConnectedThread(); 
         return 0; 
       } 

     //thread function defination in cpp file 
     void RMLThinTransport::SocketTransportClient::stayConnectedThread() 
     { 
      Sleep(20000); 
      OutputDebugStringW(L"this is stayconnected thread"); 
      while(m_tryToConnect) // get error here, not getting value of m_tryToConnect it is Boolean and declared in class. 
      { 
       if(!m_isConnected) // m_isConnected value is also not updated even if it is changed by other function 
       { 
        break; 
       } 
       /* sleep for period of time given in configuration file */ 
       Sleep(m_stayConnected); 
       if(!m_allreadyConnected) 
       { 
        bool isConnect=Connect(); 
        if(isConnect) 
        { 
         m_allreadyConnected=true; 
        } 
        OutputDebugStringW(L"isConnect false"); 
       } 
      } 
     } 

メソッド切断時にすべての値が更新されます。

bool RMLThinTransport::SocketTransportClient::disconnect() 
{ 
    m_isConnected=false; 
    m_tryToConnect=false; 
    notifyUserConnected(m_isConnected); 
    if(m_socketClient!=INVALID_SOCKET) 
    { 
     shutdown(m_socketClient,SD_BOTH); 
     closesocket(m_socketClient); 
     m_socketClient=INVALID_SOCKET; 
    } 
    Sleep(3000); 
    return false; 
} 


bool RMLThinTransport::SocketTransportClient::Connect() 
{ 
    try 
    { 
     m_socketClient = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); 
     if(m_socketClient==INVALID_SOCKET){ 
      int lastError; 
      lastError=WSAGetLastError(); 
      SocketExceptions exceptionInOpenSocket; 
      exceptionInOpenSocket.detectErrorOpenSocket(&lastError); 
      throw exceptionInOpenSocket; 
     } 
    } 
    catch(SocketExceptions& i_exceptionInOpenSocket) 
    { 
     throw i_exceptionInOpenSocket; 
     return false; 
    } 

    memset(&m_SocketAddressIn,0,sizeof(m_SocketAddressIn)); 
    m_SocketAddressIn.sin_family=AF_INET; 
    m_SocketAddressIn.sin_addr.s_addr=inet_addr(m_ccIPAddress); 
    m_SocketAddressIn.sin_port=htons(m_portNumber); 
    try 
    { 
     if(SOCKET_ERROR==connect(m_socketClient,(SOCKADDR *)&m_SocketAddressIn,sizeof(m_SocketAddressIn))) 
     { 
      m_allreadyConnected=false; 
      int lastErrorCode=WSAGetLastError(); 
      SocketExceptions exceptionInConnection; 
      exceptionInConnection.detectErrorConnect(&lastErrorCode); 
      throw exceptionInConnection; 

     } 
     else 
     { 
      setConnected(true); 
      m_allreadyConnected=true; 
      if(m_evesdropString!=""){ 
       char* charbuf=new char[m_evesdropString.size()+1]; 
       std::copy(m_evesdropString.begin(),m_evesdropString.end(),charbuf); 
       charbuf[m_evesdropString.size()]='\0'; 
       int iResult=send(m_socketClient,charbuf,strlen(charbuf),0); 
       memset(charbuf,0x00,sizeof(charbuf)); 
      } 
      CreateThread(NULL,0,receiveClientData,this,0,NULL); 
      return true; 
     } 
    } 
    catch(SocketExceptions& i_exceptionInConnection) 
    { 
     shutdown(m_socketClient,SD_BOTH); 
     closesocket(m_socketClient); 
     m_socketClient=INVALID_SOCKET; 
     this->exceptionOccurred(EST_EXCEPTIONINCONNECT); 
     return false; 
    } 
    return true; 
} 

だから誰でも問題を教えてください。

+0

ここで、あなたはレースを防ぐためにロックを使用していますか? –

+0

OK、私は私の質問を編集する私はまた、接続メソッドを配置します。 –

+0

エラーが発生した行を確認して、デバッガで実行しようとしましたか?そのコンテキストで変数の値を読み取って、どちらが間違っているかを確認します。 – Shahbaz

答えて

-1

CreateThread()をC++コードから直接使用することはお勧めできません。むしろ_beginthreadex()を使用してスレッドのC++ランタイム環境を初期化する必要があります(TLS変数など)。

+0

これは主に真実ではありません。 –

関連する問題