|
안녕하세요. 프로그램을 작성하다가 막히는 부분이 있어
글을 올립니다. 프로그램이 하는 일은 다음과 같습니다.
* 주 프로그램과 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);
}
|