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

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


Category

  김영대(2003-11-18 19:17:02, Hit : 4814, Vote : 1138
 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;





211   [윈도우즈 API] 콤포넌트의 Hint 에 그림(Bitmap) 넣기  김영대 2003/04/11 5201 1358
210   [일반/컴포넌트] 키보드의 Shift+Tab 이 눌린것처럼 처리하기  김영대 2003/04/14 4743 1312
209   [윈도우즈 API] 폼이 Minimized 되었을때 깜박이게 하기 2  김영대 2003/04/14 5982 1320
208   [COM/OLE] 그리드 자료 엑셀로 좀더 빠르게 보내기  공성환 2003/04/16 5536 972
207   [일반/컴포넌트] C에서 한글자르기  공성환 2003/04/16 4855 968
206   [COM/OLE] 기존 Excel 문서 불러와서 편집후 저장하기  김영대 2003/04/18 5460 1289
205   [일반/컴포넌트] thread-safe Queue 구현  김영대 2003/08/18 6143 1354
204   [알고리즘] 숫자를 KB, MB, GB 단위로 환산하기  김영대 2003/11/13 5072 1160
203   [일반/컴포넌트] StrToFloatDef  김영대 2003/11/13 4977 1258
202   [알고리즘] 구분자(delimiter)를 사용한 문자열 파싱(parsing)  김영대 2003/11/13 5179 1147
  [일반/컴포넌트] thread-safe Queue를 이용한 TLogThread  김영대 2003/11/18 4814 1138
200   [네트웍/인터넷] IOCP(I/O Completion Port) class  김영대 2003/11/18 11052 879
199   [네트웍/인터넷] Winsock WriteFile and Overlapped IO  김영대 2003/11/18 5441 1231
198   [시스템] 윈도우즈 서비스 목록 구하기  김영대 2004/07/22 4574 1224
197   [시스템] 윈도우즈 서비스 상태 구하기  김영대 2004/07/22 5009 1275
196   [시스템] 윈도우즈 서비스 시작/중지 하기  김영대 2004/07/22 6108 1549
195   [시스템] 윈도우즈 시스템의 스크롤바 두께 바꾸기  김영대 2004/07/24 5632 1378
194   [시스템] 마우스 아래의 윈도우 핸들 구하기  김영대 2004/07/24 9118 1661
193   [시스템] 내 프로그램의 실행 우선순의 바꾸기  김영대 2004/07/24 5139 1399
192   [윈도우즈 API] 내 프로그램의 화면을 가리는 프로그램 리스트  김영대 2004/07/24 4577 1209
191   [윈도우즈 API] Taskbar 의 특정 위치에 popup 메뉴 띄우기  김영대 2004/07/24 4614 1206
190   [윈도우즈 API] Taskbar 의 위치 추적하기  김영대 2004/07/24 4009 1072
189   [일반/컴포넌트] 윈도우즈"시작" 버튼위에 글씨 쓰기  김영대 2004/07/24 4201 1153
188   [시스템] 제어판의 모든 applet 정보 구하기  김영대 2004/07/24 4431 1141
187   [윈도우즈 API] 바로 직전에 active 되었던 윈도우와 콘트롤 구하기  김영대 2004/07/24 4646 1168
186   [윈도우즈 API] 지원하는 키보드 입력 언어 구하고 변경하기  김영대 2004/07/24 4751 1269
185   [윈도우즈 API] 현재 키보드 입력 언어 구하기  김영대 2004/07/24 4992 1354
184   [COM/OLE] 윈도우즈 "작업 표시줄 및 시작 메뉴 등록 정보" 화면  김영대 2004/07/25 6082 1634
183   [COM/OLE] 윈도우즈 "인터넷 등록 정보" 화면  김영대 2004/07/25 4262 1325
182   [COM/OLE] 윈도우즈 "날짜/시간 등록 정보" 화면  김영대 2004/07/25 6412 1653
181   [COM/OLE] 윈도우즈 "검색: 파일 또는 폴더" 화면  김영대 2004/07/25 4987 1397
180   [COM/OLE] 윈도우즈 "시스템 종료" 화면  김영대 2004/07/25 4610 1312
179   [COM/OLE] 윈도우즈 "모든 창을 최소화"  김영대 2004/07/25 6246 1710
178   [일반/컴포넌트] TList 를 이용한 stack 구조 구현  김영대 2004/07/25 4369 1135
177   [윈도우즈 API] 폼에 애니메이션 효과 주기  김영대 2004/07/25 4655 1235
176   [일반/컴포넌트] 모서리가 둥근(rounded ends) TMemo 만들기  김영대 2004/07/25 4584 1189
175   [시스템] 로컬 가상 드라이버(substitution device) 만들고 제거하기  김영대 2004/07/25 5977 1326
174   [네트웍/인터넷] 네트워크 드라이브 연결 화면 띄우기  김영대 2004/07/26 5966 1601
173   [일반/컴포넌트] TProgressbar 의 색상 바꾸기  김영대 2004/07/26 4633 1237
172   [일반/컴포넌트] TTrewView, TListView 를 이미지로 저장하기  김영대 2004/07/26 4350 965

[이전 10개] [1]..[11][12][13][14][15][16][17][18][19] 20 ..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero