亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

支持多線程的日志類,可以在線程中使用,用來與主窗口通訊

2019-11-18 18:03:37
字體:
來源:轉載
供稿:網友
 

在一些涉及到多線程的程序設計中,線程常常有一些消息要發送到用戶界面進行顯示。這方面處理的方法很多,有通過消息傳遞、全局變量、管道等。這里給出了一種通過消息傳遞和全局變量相結合的處理的方法。并且把代碼封裝到一個TLog類中,使用方便。在這里和大家分享。

//TLog類說明部分,事實上該類是一個“日志隊列”
const
  MAX_LOG_LEN=1024;
 
type
  TLog=class
  PRivate
    FLock:TCriticalSection;//互斥類,用于線程互斥訪問
    //定義日志項循環隊列--由于隊列的特性,最多能保存MAX_LOG_LEN-1條日志
    FLines:array [0..MAX_LOG_LEN-1] of string;
    FHead:integer;
    FTail:integer;
    //環隊列定義結束
    FMsgHandle:THandle;//消息接收窗口句柄
    FMsgId:integer;//消息ID
    FMsgParam:integer;//消息參數,可以用來區分不同的日志對象
    function GetIsEmpty: boolean;
    function GetCount: integer;
  public
    constructor Create(const MsgHandle:THandle;const MsgId,MsgParam:integer);
    destructor Destroy;override;
    procedure Add(const line:string);
    procedure Gets(lines:TStrings);
    procedure Clear;
    property IsEmpty:boolean read GetIsEmpty;
    property Count:integer read GetCount;
  end;


//TLog類實現部分

{ TLog }

constructor TLog.Create(const MsgHandle: THandle; const MsgId,
  MsgParam: integer);
begin
  FHead:=0;
  FTail:=0;
  FMsgHandle:=MsgHandle;
  FMsgId:=MsgId;
  FMsgParam:=MsgParam;
  FLock:=TCriticalSection.Create;
end;

destructor TLog.Destroy;
begin
  FLock.Free;
  inherited;
end;

procedure TLog.Add(const line: string);
begin
  FLock.Enter;
  try
    FLines[FTail]:=Format('[%s] %s',[FormatDateTime('hh:nn:ss',Now),line]);
    FTail:=(FTail+1) mod MAX_LOG_LEN;
    if FHead=FTail then FHead:=(FHead+1) mod MAX_LOG_LEN;//如果隊列滿,則沖掉頭部數據
  finally
    FLock.Leave;
  end;
  PostMessage(FMsgHandle,FMsgId,FMsgParam,0);//注意此處未使用SendMessage
end;

procedure TLog.Gets(lines: TStrings);
begin
  FLock.Enter;
  try
    while FTail<>FHead do
    begin
      lines.Add(FLines[FHead]);
      FHead:=(FHead+1) mod MAX_LOG_LEN;
    end;
  finally
    FLock.Leave;
  end; 
end;

procedure TLog.Clear;
begin
  FLock.Enter;
  try
    FHead:=0;
    FTail:=0;
  finally
    FLock.Leave;
  end;
end;

function TLog.GetCount: integer;
begin
  FLock.Enter;
  try
    if FTail>FHead then
      result:=FTail-FHead
    else
      result:=FTail+MAX_LOG_LEN-FHead;
  finally
    FLock.Leave;
  end;
end;

function TLog.GetIsEmpty: boolean;
begin
  FLock.Enter;
  try
    result:=FHead=FTail;//頭尾重合時為空
  finally
    FLock.Leave;
  end;
end; 

原代碼:LogUtils.pas

TLog的使用示例

1.消息定義和處理

在主窗口定義消息,如下
const
  CM_MYLOG=WM_USER+101; 

type
  TForm1 = class(TForm)
    ....
    procedure DoMyLog(var msg:TMessage);message CM_MYLOG;//消息相應
    ....
  end;

消息處理代碼
procedure TForm1.DoMyLog(var msg: TMessage);
var
  lines:TStrings;
begin
  if(msg.WParam=0) then//注意,這里的0與TLog建立時傳入的MsgParam對應
  begin
    if not FLog.IsEmpty then
    begin
      lines:=TStringList.Create;
      try
        FLog.Gets(lines);
        Memo1.Lines.AddStrings(lines);//假設輸出到Memo1中
      finally
        lines.Free;
      end;
    end;
  end;
end;

2.TLog對象定義,初始化/釋放

在主窗口或全局中定義變量
FLog:TLog;

一般在窗口建立時生成對象
procedure TForm1.FormCreate(Sender: TObject);
begin
  ...
  FLog:=TLog.Create(Handle,CM_MYLOG,0);//注意,這里的MsgParam=0
  ...
end;

在窗口銷毀時釋放對象
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ...
  FLog.Free;//注意釋放前請確認線程中已經不再使用(或者線程已經終止)
  ...
end;

3.在線程中使用TLog

  ...
  FLog.Add('具體的日志');//FLog可以在線程創建時,賦值給該線程的一個成員變量


上一篇:點擊DBGrid的Title對查詢結果排序

下一篇:軟件啟動畫面中啟動狀態的顯示

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩三级成人av网| 这里只有精品丝袜| 国产精品va在线播放我和闺蜜| 国产欧美在线观看| 欧美视频在线免费看| 成人欧美一区二区三区黑人| 国产成人亚洲综合91| 韩国视频理论视频久久| 国产精品91久久| 国产精品91在线观看| 国产成人精品999| 欧美激情精品久久久久久黑人| 成人h猎奇视频网站| 国产日韩精品在线| 亚洲国产天堂久久综合网| 国产国语videosex另类| 亚洲国产小视频在线观看| 国产欧美一区二区三区四区| 日韩精品视频观看| 欧美日韩国产在线看| 亚洲精品720p| 国产精品久久久久久久久久东京| 欧美日韩一区二区三区在线免费观看| 国产亚洲欧洲黄色| 高跟丝袜欧美一区| 精品国产福利在线| 黑人狂躁日本妞一区二区三区| 久久久女女女女999久久| 中文字幕视频一区二区在线有码| 在线看日韩欧美| 国产精品福利久久久| 亚洲跨种族黑人xxx| 一级做a爰片久久毛片美女图片| 国产亚洲欧洲高清| 日韩在线观看免费| 久久久精品2019中文字幕神马| 国内精品美女av在线播放| 欧美日韩中文字幕综合视频| 国产91精品黑色丝袜高跟鞋| 国产一区二区在线免费| 日本不卡高字幕在线2019| 日韩在线激情视频| 欧美裸身视频免费观看| 在线亚洲国产精品网| 不卡av日日日| 欧美性xxxx极品hd满灌| 欧美精品videossex性护士| 97久久精品人人澡人人爽缅北| 欧美激情手机在线视频| 成人在线中文字幕| 亚洲经典中文字幕| 97久久国产精品| 亚洲国产成人爱av在线播放| 日韩美女福利视频| 欧美激情18p| 亚洲午夜性刺激影院| 97香蕉超级碰碰久久免费软件| 亚洲国产精品推荐| 亚洲欧美日韩中文在线| 国产成人精品久久久| 国产91精品久久久久久久| 日韩精品中文字幕有码专区| 黄色一区二区在线| 精品福利在线观看| 亚洲区在线播放| 久操成人在线视频| 日韩欧美国产一区二区| 欧美一级黄色网| 亚洲精品国产福利| 久久亚洲精品中文字幕冲田杏梨| 欧美成人免费观看| 亚洲精品av在线播放| 久久精品人人做人人爽| 欧美剧在线观看| 中文字幕久久久av一区| 91wwwcom在线观看| 久久97精品久久久久久久不卡| 日韩av在线网址| 超碰97人人做人人爱少妇| 欧美又大又硬又粗bbbbb| 久久久午夜视频| 亚洲欧美色图片| 91美女片黄在线观看游戏| 日韩在线观看av| 综合久久五月天| 国产精品综合久久久| 日韩资源在线观看| 国产精品中文久久久久久久| 国产精品视频网站| 精品久久中文字幕久久av| 青青在线视频一区二区三区| 中文一区二区视频| 亚洲综合国产精品| 亚洲女人被黑人巨大进入al| 精品久久久久久久久国产字幕| 日韩女优在线播放| 美女视频黄免费的亚洲男人天堂| 一本一道久久a久久精品逆3p| 色妞欧美日韩在线| 久热精品视频在线观看| 国产精品高潮在线| 国产丝袜一区二区三区| 91精品视频在线免费观看| 4p变态网欧美系列| 亚洲性线免费观看视频成熟| 久久精品99久久久香蕉| 日韩欧美亚洲范冰冰与中字| 亚洲大胆人体视频| 97超级碰碰碰久久久| 亚洲xxxx做受欧美| 久久人人97超碰精品888| 亚洲国产另类 国产精品国产免费| 国产深夜精品福利| 亚洲男人第一av网站| 精品国产区一区二区三区在线观看| 国产精品人人做人人爽| 成人黄色av网| 最近2019中文字幕mv免费看| 在线播放日韩欧美| 久久视频在线免费观看| 2019中文在线观看| 91伊人影院在线播放| 日韩国产在线播放| 欧美中文字幕在线视频| 日韩网站免费观看| 51午夜精品视频| 亚洲欧美另类国产| 欧美大片网站在线观看| 日韩精品免费一线在线观看| 97视频在线观看亚洲| 亚洲免费视频在线观看| 亚洲福利视频久久| 日韩精品视频在线免费观看| 久久综合亚洲社区| 色婷婷成人综合| 国产精品九九久久久久久久| 在线精品播放av| 亚洲福利在线播放| 亚洲91精品在线观看| 国产精品视频一区二区三区四| 亚洲国产精品久久久久秋霞不卡| 亚洲v日韩v综合v精品v| 日韩在线观看免费高清完整版| 日本久久91av| 麻豆国产精品va在线观看不卡| 57pao成人国产永久免费| 亚洲a级在线播放观看| 日韩女优人人人人射在线视频| 成人在线中文字幕| 欧美理论电影在线播放| 日本电影亚洲天堂| 97免费中文视频在线观看| 青草热久免费精品视频| 欧美日韩免费区域视频在线观看| 久久久久北条麻妃免费看| 成人黄色短视频在线观看| 亚洲精品之草原avav久久| 欧美激情精品久久久久久变态| 青青草国产精品一区二区| 92福利视频午夜1000合集在线观看| 国产精品毛片a∨一区二区三区|国| 久久精品免费电影| 国内精品久久久久久久| 中文字幕最新精品|