|
쓰래드에서 텍스트 파일을 읽어서 해당 그리드에 내용을 출력 해주는건데요.
이게 텍스트 파일의 내용이 많아 지면.. 쓰래드에서 cpu를 모두 점유를 해버려서
정작 메인폼에서는 타이머도 그 시간동안 동작을 안하는거 같든데.
실질적으로 다른 쓰래드도 멈추는지 아니면 비주얼한 부분만 일단 멈춰 보이는지는 잘 알수 없지만
어찌 됬든간에.. 좀더 빠르게 파일을 읽어서 데이타를 스트링그리드에 표현하는 방법에 대해서 생각해봐야 할거 같습니다. 소스는 쓰래드 내용을 그대로..
__fastcall ReadDataToFileThread::ReadDataToFileThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority = tpTimeCritical;
//Priority = tpLowest;
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall ReadDataToFileThread::Execute()
{
Synchronize(ReadFile);
}
//---------------------------------------------------------------------------
void __fastcall ReadDataToFileThread::ReadFile()
{
AnsiString Str;
AnsiString Data;
AnsiString FileName;
TDateTime StartT,NextT;
int R_AutoSaveTimes;
int F1_RCount;
int iFileHandle;
int iFileLength;
int iBytesRead;
int Col_C=0;
int Row_C=1;
int Datacase;
int AT;
int i;
int j;
int PP;
int MaxRow;
int inc;
char *pszBuffer;
Form1->StringG->Visible = false;
Form1->BitBtn4->Enabled = false;
R_AutoSaveTimes = DModule->AutoSaveTimes;
F1_RCount = Form1->MySG->RowCount;
if(R_AutoSaveTimes != 0)
PP = (R_AutoSaveTimes * 2000) + F1_RCount;
else PP = F1_RCount;
Form1->ProgressBar1->Max = PP;
Form1->Chart3->Visible = false;
if(R_AutoSaveTimes >= 1) {//2000개씩의 파일 갯수를 알수 있습니다.
for(AT=1;AT<=R_AutoSaveTimes;AT++){
try
{
FileName = Form1->App_Dir+"\\temp\\STest"+IntToStr(AT)+".atd";
iFileHandle = FileOpen(FileName,fmOpenRead);
iFileLength = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
pszBuffer = new char[iFileLength+1];
iBytesRead = FileRead(iFileHandle,pszBuffer,iFileLength);
FileClose(iFileHandle);
for(i=0;i<iBytesRead;i++)
{
//1!2003-12-29 오후 2:03:58!0.00E-00!3.00E-04!1.00E-03!0.00E-00!0.00E-00!0000!0000!!!!!!!!!
//!는 데이타를 구분 하구요 맨끝의 \n 은 다음줄로 넘어 가는겁니다.
// 여기 for문에서 시간이 많이 걸리는거 같습니다.
if(pszBuffer[i] != '!') Datacase = 0;
else Datacase = 1;
if(pszBuffer[i] == '\n') Datacase = 2;
switch(Datacase){
case 0:
Data += Str.sprintf("%c",pszBuffer[i]);
break;
case 1:
Form1->StringG->Cells[Col_C][Row_C] = Data;
Data = "";
Col_C += 1;
break;
case 2:
Col_C = 0;
Form1->StringG->RowCount += 1;
Row_C += 1;
Data="";
Form1->ProgressBar1->Position += 1;
break;
}//swich;
Form1->StringG->Row = Form1->StringG->RowCount-1;
}//for
delete[] pszBuffer;
}//try
catch(...)
{
Application->MessageBox("File Read Error !","파일에러",IDOK);
}//catch
Sleep(10);
}//for
}//if
Form1->StringG->RowCount = F1_RCount + Row_C-1;
Form1->Edit9->Text = "1";
Form1->Edit10->Text = StrToInt(Form1->StringG->RowCount-2);
for(i=Row_C;i<Form1->StringG->RowCount-1;i++)
{
for(j=0;j<Form1->StringG->ColCount;j++){
Form1->StringG->Cells[j][i] = Form1->MySG->Cells[j][i-Row_C];
}
Form1->ProgressBar1->Position += 1;
Form1->StringG->Row = i;
}
Form1->ProgressBar1->Position = 0;
if(Form1->CheckBox1->Checked){
MaxRow = Form1->StringG->RowCount-1;
inc =(int) MaxRow / 100;
if(inc == 0) inc = 1;
StartT = StrToDateTime(Form1->StringG->Cells[1][1]);
for(i=1; i <= MaxRow-1; i+=inc){
NextT = StrToDateTime(Form1->StringG->Cells[1][i]) - StartT;
Form1->Chart3->Series[0]->AddXY(NextT,StrToFloat(Form1->StringG->Cells[2][i]),"",(TColor)clTeeColor);
Form1->Chart3->Series[1]->AddXY(NextT,StrToFloat(Form1->StringG->Cells[3][i]),"",(TColor)clTeeColor);
Form1->Chart3->Series[2]->AddXY(NextT,StrToFloat(Form1->StringG->Cells[4][i]),"",(TColor)clTeeColor);
Form1->Chart3->Series[3]->AddXY(NextT,StrToFloat(Form1->StringG->Cells[5][i]),"",(TColor)clTeeColor);
Form1->Chart3->Series[4]->AddXY(NextT,StrToFloat(Form1->StringG->Cells[6][i]),"",(TColor)clTeeColor);
}//for
}//if
Form1->Chart3->Visible = true;
Form1->MyReadDataToFile = NULL;
Form1->BitBtn4->Enabled = true;
Form1->StringG->RowCount -= 1;
Form1->StringG->FixedRows = 1;
Form1->StringG->Visible = true;
SetEvent(Form1->hReadDataToFile);
}
|