C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[15035] 인디 TCPServer 에서 Synchronize 문제...
인디가 미워-.-; [] 1511 읽음    2002-01-26 13:19
안녕하세요...
인디를 사용해서 파일전송을 하고 있습니다.. 서버쪽에서는 클라이언트가 보내는 파일을 받아서
창을 하나 띄우고 프로그래스 바등을 사용해서 진행상황을 보여줍니다...

그런데 인디컴포넌트가 생겨 먹은것이..

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 로 작업을 하고 있습니다..

+ -

관련 글 리스트
15035 인디 TCPServer 에서 Synchronize 문제... 인디가 미워-.-; 1511 2002/01/26
15037     인디(Indy) 잘 되나요? 고등어 1330 2002/01/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.