::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-11-18 19:17:02, Hit : 4571, Vote : 1083
 thread-safe Queue를 이용한 TLogThread

Type
  TLog = class(TThread)
  private
    FQueue: TStringlist;
    FFilename: String;
    FGuardian: TCriticalSection;
    FFailed: Boolean;
  protected
    procedure Execute; override;
    procedure WriteString( const S: String );
    function Pop( var S: String ): Boolean;
  public
    constructor Create( const aFilename: String );
    destructor Destroy; override;
    Procedure Add( const S: String );
    Function Failed: Boolean;
  end;

Constructor TLog.Create( const aFilename: String );
  Begin
    FQueue := TStringlist.Create;
    FFilename := aFilename;
    If not FileExists( FFilename ) Then
      TFilestream.Create( FFilename, fmCreate ).Free;
    FGuardian := TCriticalSection.Create;
    inherited Create( true );
  End;

Destructor TLog.Destroy;
  Begin
    FQueue.Free;
    FGuardian.Free;
    inherited;
  End;

Procedure TLog.Add( const S: String );
  Begin
    FGuardian.Acquire;
    try
      FQueue.Add(S);
      If Suspended Then
        Resume;
    finally
      FGuardian.Release;
    end;
  End;

Function TLog.Failed: Boolean;
  Begin
    Result := FFailed;
    FFailed := false;
  End;

Function TLog.Pop( var S: String ): Boolean;
  Begin
    FGuardian.Acquire;
    try
      Result := FQueue.Count > 0;
      If Result Then Begin
        S:= FQueue[0];
        FQueue.Delete(0);
      End; { If }
    finally
      FGuardian.Release;
    end;
  End;

Procedure TLog.WriteString( const S: String );
  const
    CRLF = #13#10;
  Var
    fs: TFilestream;
  Begin
    If S = '' Then Exit;
    fs:= TFilestream.Create( FFilename, fmOpenWrite or fmShareDenyWrite );
    try
      fs.WriteBuffer( S[1], Length(S));
      fs.WriteBuffer( CRLF[1], 2 );
    finally
      fs.free;
    end;
  End;

Procedure Tlog.Execute;
  Var
    S: String;
  Begin
    While not Terminated Do Begin
      try
        While Pop(S) and not Terminated Do
          WriteString(S);
        If not Terminated Then
          Suspend;
      except
        Failed := true;
        // may want to record more error info here
      end;
    End; { While }
  End;





  [일반/컴포넌트] thread-safe Queue를 이용한 TLogThread  김영대 2003/11/18 4571 1083
770   [알고리즘] 구분자(delimiter)를 사용한 문자열 파싱(parsing)  김영대 2003/11/13 4983 1091
769   [일반/컴포넌트] StrToFloatDef  김영대 2003/11/13 4768 1214
768   [알고리즘] 숫자를 KB, MB, GB 단위로 환산하기  김영대 2003/11/13 4851 1107
767   [일반/컴포넌트] thread-safe Queue 구현  김영대 2003/08/18 5557 1151
766   [COM/OLE] 기존 Excel 문서 불러와서 편집후 저장하기  김영대 2003/04/18 5148 1235
765   [일반/컴포넌트] C에서 한글자르기  공성환 2003/04/16 4603 906
764   [COM/OLE] 그리드 자료 엑셀로 좀더 빠르게 보내기  공성환 2003/04/16 5274 915
763   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기 2  김영대 2003/04/14 5520 1256
762   [일반/컴포넌트] 키보드의 Shift+Tab 이 눌린것처럼 처리하기  김영대 2003/04/14 4561 1260
761   [윈도우즈 API] 콤포넌트의 Hint 에 그림(Bitmap) 넣기  김영대 2003/04/11 4975 1294
760   [윈도우즈 API] 콤포넌트에 풍선 도움말 달기  김영대 2003/04/11 5591 1309
759   [윈도우즈 API] TScrollBox 안에 Animation으로 Form 띄우기  김영대 2003/04/11 4464 1252
758   [일반/컴포넌트] 동적으로 프로젝트의 Main form 바꾸기  김영대 2003/04/11 4650 1141
757   [시스템] 파일 복사하면서 진행상태와 남은 시간 표시하기  김영대 2003/04/10 5855 1199
756   [시스템] 실행중인 모든 프로그램의 실행파일명 구하고 검색하기  김영대 2003/04/10 5498 1219
755   [시스템] 파일(들)을 클립보드로 복사하여 탐색기에서 붙여넣기 하기  김영대 2003/04/10 5265 1350
754   [일반/컴포넌트] GIF 이미지의 width/height 구하기  김영대 2003/04/10 4452 1194
753   [윈도우즈 API] 4가지 윈도우즈 관련 폴더의 path 구하기  김영대 2003/04/08 5627 1271
752   [일반/컴포넌트] Thread in a Timer  김영대 2003/04/07 6732 1066
751   [알고리즘] 주어진 구분자(들)로 분리된 토큰(token)문자열 구하기  김영대 2003/04/02 4494 1026
750   [일반/컴포넌트] Form의 Caption 에서의 Click 알아내기  김영대 2003/04/01 3995 997
749   [윈도우즈 API] 키보드 입력 로케일(Locale) 구하기  김영대 2003/04/01 4086 1007
748   [윈도우즈 API] "내 컴퓨터"에 있는 폴더들의 디렉토리 구하기  김영대 2003/04/01 5119 1466
747   [윈도우즈 API] 네트워크 환경의 "컴퓨터 찾아보기" 화면 띄우기  김영대 2003/04/01 4951 1144
746   [알고리즘] Huffman 압축 알고리즘  김영대 2003/04/01 4508 1205
745   [일반/컴포넌트] Windows의 사용자이름, 작업그룹 구하기  김영대 2003/04/01 4726 1167
744   [일반/컴포넌트] ComboBox에 IE의 URL 입력창 같은 근접검색 두기  김영대 2003/03/31 4447 1107
743   [윈도우즈 API] RichEdit에서 URL을 HyperLink 로 표시하기  김영대 2003/03/31 5262 1238
742   [일반/컴포넌트] 이미지를 마우스로 drag시 테두리 효과를 주면서 이동 시키기  김영대 2003/03/31 5023 1149
741   [일반/컴포넌트] PageControl의 TabSheet 마다 PopupMenu 두기  김영대 2003/03/31 5013 1196
740   [일반/컴포넌트] Delphi의 Tokenizer TParser 사용 예제  김영대 2003/03/31 4610 1209
739   [일반/컴포넌트] 네트워크 컴퓨터의 레지스트리 접근하기  김영대 2003/03/31 4203 1059
738   [네트웍/인터넷] 윈도우즈 네트워크로 메시지 보내기  김영대 2003/03/30 5146 1150
737   [네트웍/인터넷] IP로 이름 구하기 또는 이름으로 IP 구하기  김영대 2003/03/30 4765 1235
736   [일반/컴포넌트] IE "시작 페이지" 읽어오고 바꾸기  김영대 2003/03/30 5644 1368
735   [일반/컴포넌트] URL encoding 하기  김영대 2003/03/30 4440 1142
734   [일반/컴포넌트] URL 을 각 part로 분리하기  김영대 2003/03/30 4771 1223
733   [일반/컴포넌트] 기본 SMTP 서버와 계정 알아내기  김영대 2003/03/30 4340 1084
732   [일반/컴포넌트] Microsoft Internet Explorer의 버전 번호  김영대 2003/03/30 4182 1079

[1][2][3][4][5] 6 [7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero