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
[28421] [질문] 파일 읽어서 스트링그리드에 출력하기(속도 개선해주세요)
강영준 [k700k] 1198 읽음    2004-01-07 16:57
쓰래드에서 텍스트 파일을 읽어서 해당 그리드에 내용을 출력 해주는건데요.
이게 텍스트 파일의 내용이 많아 지면.. 쓰래드에서 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);
}

+ -

관련 글 리스트
28421 [질문] 파일 읽어서 스트링그리드에 출력하기(속도 개선해주세요) 강영준 1198 2004/01/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.