|
안녕하세요?
전 BCB4.0과 Indy 9.0.3B 를 사용하여 Application 서버를 작성하려다가
몇가지 컴파일 에러와 뉴스그룹에 올라와 있는 많은 버그관련 문의에 놀라서
후다닥 정리를 하구서 델파이로 다시 시작했습니다.
BCB+Indy로 안정적인 개발이 가능한지 궁금합니다.
그리고 질문하시 내용에 대해서는...
제 생각으로는 각 연결시 생성되는 thread에서 자신의 파일전송 윈도우를 생성해 주신 후에
파일 전송 중에 update를 해주시는면 되지 않을까 생각됩니다.
FileServerExecute : 새로 접속한 연결에 대한 AThread가 생성됨
- Tfilereceiverform pfrf = new Tfilereceiverform : 해당 클라이언트에 대한 윈도우 생성
- 파일을 전송하는 중에 pfrf를 update함.
VCL Thread에서 파일 전송 윈도우들을 관리해야할 필요가 있다면
파일 전송 윈도우들의 Pool을 만들어서 각 thread에서 하나씩 받아오는
윈도우 관리자를 만드시면 어떨지요...
윈도우 관리자에서는 각 thread별로 생성된 윈도우와 thread id의 쌍을 이용하여
해당 thread에서 요청이 올때 적절한 윈도우를 return하면 될 듯 합니다.
그럼.. 부족하나마 도움이 되었기를 바랍니다.
인디가 미워-.-; 님이 쓰신 글 :
: 안녕하세요...
: 인디를 사용해서 파일전송을 하고 있습니다.. 서버쪽에서는 클라이언트가 보내는 파일을 받아서
: 창을 하나 띄우고 프로그래스 바등을 사용해서 진행상황을 보여줍니다...
:
: 그런데 인디컴포넌트가 생겨 먹은것이..
:
: 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 로 작업을 하고 있습니다..
|