|
안녕하세요...
인디를 사용해서 파일전송을 하고 있습니다.. 서버쪽에서는 클라이언트가 보내는 파일을 받아서
창을 하나 띄우고 프로그래스 바등을 사용해서 진행상황을 보여줍니다...
그런데 인디컴포넌트가 생겨 먹은것이..
void __fastcall TdmServer::FileServerExecute(TIdPeerThread *AThread)
{
}
이런 형태로 OnExecute 이벤트 안에서 처리를 하도록 되어 각 Thread 별로 처리를 하니까..
파일 전송부분은 잘되는데.. 문제는 각 Thread 별로 하나씩 띄워진 창을 어떻게 알수가 있는지
궁금합니다...
AThread->Synchronize( UpdateUI );
이런형태로 해서 UpdaeUI 함수에서 처리를 하려고도 해 봤지만 UpdateUI 라는 함수가 인자를
포함하지 못하게 되어있지 않습니까..? 이 함수가 인자를 포함하고 있지 못하는데 어떻게 여러개의
창들중에서 지금 내가 전송 받고 있는 각 Thread 들과 창들간을 연결해서 진행상황등을 보여줄수
있는지 궁금합니다.. 이궁 말을 잘 못해서리 이해가 잘 되셨는지... -.-;
현재 저는 DataModule 위에 IndyTcpServer 컴포넌트를 올려놓고.. 이 Server Component 의 OnExcute 이벤트에서 파일 전송을 담당하고 있습니다... 간략하게 소스를 올려보겠습니다..
Tfilereceiverform *pfilereceiverwindow = NULL;
void __fastcall TdmServer::FileServerExecute(TIdPeerThread *AThread)
{
char pBuff[MAX_BUFFER];
try
{
AThread->Connection->ReadBuffer( pBuff, MAX_BUFFER );
}
catch( ... )
{
}
if( strlen( pBuff ) > 0 )
{
for( int i = 0; i < ((TfrmMainForm*)Owner)->m_plstFileReceiverWindow->Count; i++ )
{
pfilereceiverwindow = (Tfilereceiverform*)((TfrmMainForm*)Owner)->m_plstFileReceiverWindow->Items[i];
if( pfilereceiverwindow->GetRemoteIP() == AThread->Connection->Binding->PeerIP )
break;
}
if( !pfilereceiverwindow ) return;
TFileStream* pStream = new TFileStream( pfilereceiverwindow->GetReceiveFileName(), fmCreate );
pStream->Seek( 0, soFromBeginning );
while( true )
{
if( !pfilereceiverwindow->IsReceiveDone() )
{
pfilereceiverwindow->m_ireceivesize += pStream->Write( pBuff, MAX_BUFFER );
AThread->Synchronize( UpdateUI );
try
{
AThread->Connection->ReadBuffer( pBuff, MAX_BUFFER );
}
catch( ... )
{
}
}
}
delete pStream;
pfilereceiverwindow->FileReceiveDone();
}
}
//---------------------------------------------------------------------------
void __fastcall TIdSocket::UpdateUI()
{
pfilereceiverwindow->pbFileReceiver->Position =
pfilereceiverwindow->pbFileReceiver->Position + MAX_BUFFER;
pfilereceiverwindow->Caption = "파일 전송 중";
}
위와 같은데요.. 만약에 전송이 한곳에서만 이루어 지고 있다면 상관이 없겠지만 하나가 전송하고 있는데 또 다른 곳에서 전송을 시작하게 되면 pfilereceiverwindow 라는 포인터의 값이 바뀔것이고 그렇게 되면 이전에 전송 받고 있던 내용도 영향을 받을 거 같은데요...
이런 문제를 어떻게 해결해야 할지...
그러니까.. 제 요지는
Indy 를 사용해서 여러명의 사용자들로 부터 파일전송을 받고 각 사용자들과의 파일전송 진행상황을 창을 통해서 보여주고 싶은데 어떻게 해야할까요... 이게 궁금합니다...
고수님들의 도움을 기다리겠습니다.. 감사합니다..
참고로 전 DLL 로 작업을 하고 있습니다..
|