|
메세지는 후킹으로 받을 수 있는 부분을 만들어 놓으시면 될 것 같습니다. PostMessage는 그렇지 않지만, SendMessage 경우에는 메세지를 정상적으로 받기 전까지는 보낸 컴퓨터로 응답이 가지 않습니다. 그렇기 때문에, 받은 메세지가 무시되어 버리는 일은 걱정하시지 않으셔도 될 것 같습니다.
그리고, FTP는 Indy의 FTP를 사용하시기 바랍니다. 훨씬 빠르고 에러율이 적습니다 IdAntiFreeze와 쓰시면, 멈춤 현상을 제거할 수 있습니다. FTP의 OnWork 에서 파일이 전송될때마다 주기적으로 ProcessMessages 를 해주시고, 파일을 저장할때도 ProcessMessages를 해주셔야 할 것 같습니다.
생각만으로 말씀드려서 또 다른 문제가 생길지 모르겠네요. 원래 이런 문제들은 어렵잖아요.. -_-a
아더 님이 쓰신 글 :
: 안녕하세요. 프로그램을 작성하다가 막히는 부분이 있어
: 글을 올립니다. 프로그램이 하는 일은 다음과 같습니다.
:
: * 주 프로그램과 2개의 쓰레드로 구성
:
: 1. 주 프로그램:
: ㅁ. 사운드 카드에서의 입력을 받아 버버에 저장 후
: 버퍼가 다차면 메시지 발생
: ㅁ. 버퍼가 다찯다는 메시지가 오면 버버내용을 환형 큐에 옮긴 후
: 버퍼를 스위칭 (더블 버퍼링 사용)
: 이때 파일 저장 쓰레드가 없으면 파일저장 쓰레드 생성
: 2. 쓰레드 1
: ㅁ. 환형 큐에 데이터가 있으면 데이터를 파일로 저장
: 3. 쓰레드 2
: ㅁ. 저장 완료된 파일이 있으면 FTP로파일 전송
:
: * 질문
: 프로그램이 아직 완성되지 않아 어떤 문제가 있을지 확실친 않치만
: 우선 파일 저장시와 파일 전송시 주 프로그램이 메시지를 처리하지 못하는
: 상황이 발생하지 않을까 하는 점입니다. 그래서 테스트용으로
: 프로그램을 하나 만들어 보았는데, 역시 파일저장 쓰레드에서 문제가 생기는
: 것 같습니다. 이전 프로그램(지금 프로그램은 이전에 SDK API 로 짠 것을 BCB용으로 바꾸는 중)
: 에서는 PeekMessage..., 등을 사용 했었는데, 이번에는 Application->ProcessMessage를
: 사용하려고 합니다. 임프님께서 쓰신 글들 중에서 Application->ProcessMessage를
: 사용할때는 주의를 요한다는 글을 본적이 있는데, 이경우 사용해도 되는지 알고 싶습니다.
: 그리고 파일 전송시 파일을 작는 부분으로 나누어 전송하는 것이 아니라 NMFTP 컴포넌트
: 의 Upload 메소드를 사용합니다. 만약 전송하고자 하는 파일의 용량이 메우 클경우
: 전송시 메시지 처리에 문제가 생기는지 아닌지 알고 싶습니다.
: (현재 테스트 프로그램에서는 별 문제가 없는 것 같긴 한데....)
: 테스트용 프로그램 소스는 아래와 같습니다.
:
:
: /* 파일전송 쓰레드 */
: void __fastcall TFTPThread::Execute()
: {
: HANDLE hFile;
: int Sent = 0;
: String FileName;
: String FTPFileName;
: WIN32_FIND_DATA ff;
: bool NextFile = true;
:
: FileName = "*.ftp"; /* 확장자가 "ftp" 인 파일 */
: hFile=FindFirstFile(FileName.c_str(), &ff); /*
: while(NextFile != 0 && hFile != INVALID_HANDLE_VALUE && Terminated != true)
: { /* 확장자가 "ftp" 인 파일을 찾아 전송 */
: FileName = String(ff.cFileName);
: FTPFileName = FileName + ".transfer";
: /* Upload 메소드를 사용하여 전송 */
: /* 이때 Upload 메소드의 처리가 다 끝나지 않았을 경우(전송중)
: 다른 메시지 처리를 놓치지 않을지.....? */
: TestMainForm->NMFTP->Upload(FileName, FTPFileName);
: NextFile=FindNextFile(hFile,&ff);
: }
: }
:
:
: /* 파일 저장 쓰레드 */
: void __fastcall TSaveThread::Execute()
: {
: int FileHandle;
: int TranSize = 0;
: short int Buf[2048] = {1, }; /* 시험용 데이터 */
:
: FileHandle = FileCreate(String("TMP.TEST"));
: do
: { /* 극단적인 상황을 가정하여 파일 쓰기를 무한으로 돌림 */
: FileWrite(FileHandle, (short int*)Buf, sizeof(short int) * 2048);
: /* 파일 쓰기 무한 루프로 인하여 시스템 응답 無 */
: /* 여기에 뭔가 처리를 해주긴 해야 할 것 닽긴 한테...... */
: } while (Terminated != true);
:
: FileClose(FileHandle);
: }
:
:
:
:
:
|