|
안녕하세요..
Indy 8 을 사용해서 메신저 성격의 프로그램을 만들고 있습니다...
IdTcpServer 에서 메시지를 받아서 메시지가 있으면 새로운 창을 띄워서 그 창에 메시지 내용을
출력하는 루틴입니다...
문제는 IdTcpServer 에서는 메시지 전달까지는 잘 되는데 출력창을 하나 띄우게 되면 출력창이 정상적으로
띄워지지가 않고 뜨다가 멈춘 상태에서 프로그램이 죽어버립니다..
IdUdpServer 를 사용해서 Udp 통신을 하게 되면 정상적으로 잘 동작이 됩니다..
꼭 Tcp 통신을 하게 되면 이런 현상이 발생하는 군요... ㅠ.ㅠ
아래에 TcpServer 에서 받아 처리하는 부분을 올려보겠습니다..
void __fastcall TIdSocket::IdTcpServerExecute(TIdPeerThread *AThread)
{
BASEMSG *pMsg = new BASEMSG;
// AnsiString asMsg;
try
{
// asMsg = AThread->Connection->ReadLn( "", 5000 );
AThread->Connection->ReadBuffer( (BASEMSG*)pMsg, sizeof( BASEMSG ) );
}
catch( ... )
{
}
if( strlen( pMsg->Msg ) > 0 )
{
switch( pMsg->TypeInfo )
{
case MESSAGE_INCOMMING :
Process_Message( AThread, pMsg );
break;
}
}
delete pMsg;
/*
if( asMsg.Length() > 0 )
Process_Message( AThread, asMsg );
*/
}
//---------------------------------------------------------------------------
void __fastcall TIdSocket::Process_Message( TIdPeerThread* AThread, BASEMSG* pMsg )
//void __fastcall TIdSocket::Process_Message( TIdPeerThread* AThread, AnsiString asMsg )
{
int i = 0;
bool isPrint = false;
for( i = 0; i < ((TfrmMainForm*)Owner)->m_lstChatWindows->Count; i++ )
{
TfrmChat* pChat = (TfrmChat*)(((TfrmMainForm*)Owner)->m_lstChatWindows->Items[i]);
// if( pChat->m_asPeerIP == AThread->Connection->Binding->PeerIP );
if( pChat->m_asPeerIP == AThread->Connection->Binding->PeerIP )
{
pChat->AddData( pMsg->Msg );
isPrint = true;
break;
}
}
if( !isPrint )
{
TfrmChat *ChatWindow = new TfrmChat( this->Owner );
ChatWindow->m_asUserID.sprintf( "%s", pMsg->UserID );
ChatWindow->m_asPeerIP = AThread->Connection->Binding->PeerIP;
// ChatWindow->AddData( asMsg );
ChatWindow->AddData( pMsg->Msg );
((TfrmMainForm*)Owner)->m_lstChatWindows->Add( ChatWindow );
ChatWindow->Show();
// SetForegroundWindow( ChatWindow->Handle );
}
}
여기 위에서 ChatWindow->Show() 를 하게 되면 ChatWindow 가 뜨다가 다 뜨지 않고 멈춰버립니다..
이유가 뭔지 정말 궁금합니다.. 예전에도 이런 경험이 있었는데 꼭 IndyTcpServer 로 작업을 하면 이런
현상이 발생하더군요.. 해결방법이 있으면 한수 지도 바랍니다... 감사합니다.
|