全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1510
推到 Plurk!
推到 Facebook!

延續之前thread 的問題

尚未結案
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-05 12:56:26 IP:218.103.xxx.xxx 未訂閱
現在證明了那個thread 應該不會hold 住 mainform 但不知道是不是我自己要做的東西用了太多for loop 所以造成main form 好像當了一樣, 我還是把我的 code整個 放上來,請各位高手幫忙    謝謝     
 
unit DataThread;    interface    uses
  Classes,Windows,SysUtils,DBTables,BDE,DBCommon,forms,DatabaseModuleUnit,filectrl,DB;    type
  DBHandler = class(TThread)
  private
    { Private declarations }
    fEndProc     : TNotifyEvent;
    fSession     : TSession;
    fDataBase    : TDatabase;
    fDataModule  : TDataModule;
    fTable       : TTable;
    fTable1      : TTable;
    fFileListBox1: TFileListBox;
    Success      : Boolean;
    ErrMsg : string;
  protected
    procedure DoProc();
    procedure Handler();
    procedure MyTerminated( Sender : TObject );
    procedure CreateDBTable(iTableName :String);
    function Decode(Raw:string):tstringlist;
    Function HexToInt(Hex :String):Int64;
  public
    constructor Create(EndProc: TNotifyEvent = nil); overload;
    destructor Destroy; override;
    procedure Execute; override;
  published
  end;    implementation    uses CCUConsole;    procedure DBHandler.Execute;
begin
     while not Terminated do begin
           try
              try
                 DoProc;
                 Success := True;
              except on E:Exception do begin
                 ErrMsg := E.Message;
                 Success := False;
              end;
           end;
           finally
                  Terminate;
           end;
     end;
end;    constructor DBHandler.Create(EndProc: TNotifyEvent = nil);
begin
     FreeOnTerminate := True;
     OnTerminate := MyTerminated;
     Success := Success;
     inherited Create(True);
     fDataModule:= TDataModule.Create(nil);
     fSession := TSession.Create(fDataModule);
     fSession.SessionName := 'ThreadSession' inttostr(Sessions.Count);
     fDataBase := TDatabase.Create(fDataModule);
     fDataBase.SessionName := fSession.SessionName;
     fDataBase.DatabaseName :=  DatabaseModule.DB_Name;
     fTable := TTable.Create(fDataModule);
     fTable.DatabaseName :=  DatabaseModule.DB_Name;
     fTable1 := TTable.Create(fDataModule);
     fTable1.DatabaseName :=  DatabaseModule.DB_Name;
     fFileListBox1 := TFileListBox.Create(fDataModule);
     Priority := tpLowest;
     fEndProc :=  EndProc;
     Resume;
end;    destructor DBHandler.Destroy();
begin
     fDataModule.Free();
     inherited;
end;    procedure DBHandler.MyTerminated( Sender : TObject );
var M : TMethod;
begin
  if Success then begin
    M := TMethod(fEndProc);
    if Assigned(fEndProc) then fEndProc(TObject(M.Data));
  end
  else begin
    Application.MessageBox(PChar(ErrMsg),PChar(Application.Title), MB_OK or MB_ICONERROR);
  end;
end;    procedure DBHandler.DoProc;
begin
     if (not Terminated) then begin
         Synchronize(Handler);
         Sleep(500);
     end;
end;    procedure DBHandler.Handler();
var DecodeData,DataBaseFileList,buff :Tstringlist;
    i,j : integer;
    Vehicle_ID,Dir : string;
begin
     DecodeData       := Tstringlist.Create;
     DataBaseFileList := Tstringlist.Create;         DatabaseModule.GetDBTableList(DataBaseModule.DB_NAME,DatabaseModule.BlackBoxPrefix '*',DataBaseFileList);         for i := 0 to DataBaseFileList.Count -1 do
     begin
     with fTable do
     begin
          Active := False;
          TableType := ttDefault;
          TableName := DataBaseFileList[i];
          Active := True;
          First;              for j := 0 to fTable.RecordCount-1 do
          begin
               buff := Decode(FieldByName('RAW_DATA').Value);
               DecodeData.Assign(buff);
               buff.free();
               if DecodeData[3] <> 'Crash Data' then
               begin
                    Vehicle_ID := FieldByName('Vehicle_ID').Value   '_'   DatabaseModule.BlackBoxPrefix  '_'  StringReplace(Copy(DecodeData[3],1,10),'/','_',[rfReplaceAll, rfIgnoreCase]);
                    with ftable1 do
                    begin
                         Active := False;
                         TableType := ttDefault;
                         TableName := Vehicle_ID;
                         if Not Exists then CreateDBTable(Vehicle_ID);
                         Active := True;
                         Append;
                         FieldByName('Rec_No').Value := fTable.FieldByName('Rec_No').Value;
                         FieldByName('Unit_ID').Value := fTable.FieldByName('Unit_ID').Value;
                         FieldByName('Time_stamp').Value := fTable.FieldByName('Time_stamp').Value;
                         FieldByName('IP').Value := fTable.FieldByName('BDEG_IP').Value;
                         FieldByName('V_ID').Value := fTable.FieldByName('Vehicle_ID').Value;
                         FieldByName('E_ID').Value := DecodeData[0];
                         FieldByName('Num').Value := DecodeData[1];
                         FieldByName('Value').Value := DecodeData[2];
                         FieldByName('K_Time_stamp').Value := StrToDateTime(DecodeData[3]);
                         FieldByName('RAW_DATA').Value := fTable.FieldByName('RAW_DATA').Value;
                         Post;
                         Active := False; // added on 04/04/2005
                    end;
               end else
               begin
                    Edit;
                    FieldByName('Error_Message').Value := DecodeData[3];
                    Post;
               end;
               next;
               Sleep(1000);
          end;
          Active := False; // added on 04/04/2005
     end;
     Sleep(1000);
     end;         DecodeData.Free;
     DataBaseFileList.Free;
end;    function DBHandler.Decode(Raw:string):tstringlist;
var
    Date,Time :string;
    Yr,Mth,Day,Hr,Min,Sec: integer;
begin
     result  := tstringlist.create();
     result.Clear;
     if Length(Raw) = 24 then
     begin
          Result.Add(InttoStr(HexToInt(copy(raw,1,2)))); //eventID
          Result.Add(InttoStr(HexToInt(copy(raw,3,2))*256*256   HexToInt(copy(raw,5,2))*256   HexToInt(copy(raw,7,2)))); // NUM
          Result.Add(InttoStr(HexToInt(copy(raw,9,2))*256   HexToInt(copy(raw,11,2)))); // Value
          Yr      := HexToInt(Copy(Raw,13,2));
          Mth     := HexToInt(Copy(Raw,15,2));
          Day     := HexToInt(Copy(Raw,17,2));
          Hr      := HexToInt(Copy(Raw,19,2));
          Min     := HexToInt(Copy(Raw,21,2));
          Sec     := HexToInt(Copy(Raw,23,2));
          Date    := IntToStr(Day) '/' IntToStr(Mth) '/' IntToStr(Yr);
          Time    := IntToStr(Hr) ':' IntToStr(Min) ':' IntToStr(Sec);
          try
             Result.Add(FormatDateTime(DataBaseModule.DateFormat ' ' DataBaseModule.TimeFormat,StrToDateTime(Date ' ' Time))); // Date
          except
             Result.Add('Crash Data');
          end;
     end else
     begin
          Result.Add('Crash Data');
          Result.Add('Crash Data');
          Result.Add('Crash Data');
          Result.Add('Crash Data');
     end;
end;    procedure DBHandler.CreateDBTable(iTableName :String);
begin
     with ftable1 do
     begin
          with FieldDefs do
          begin
               Clear;
               Add('ID',ftAutoInc,0,True);
               Add('Rec_No',ftstring,10,False);
               Add('Unit_ID',ftstring,10,False);
               Add('Time_Stamp',ftdateTime,0,False);
               Add('IP',ftstring,20,False);
               Add('V_ID',ftstring,20,False);
               Add('E_ID',ftstring,3,False);
               Add('Num',ftstring,8,False);
               Add('Value',ftstring,5,False);
               Add('K_Time_stamp',ftdateTime,0,False);
               Add('RAW_DATA',ftstring,240,False);
          end;              with IndexDefs do
          begin
               Clear;
               Add('', 'ID', [ixPrimary, ixUnique]);
          end;
          CreateTable;
     end;
end;    Function DBHandler.HexToInt(Hex :String):Int64;
Var Sum : Int64;
    I,L : Integer;
Begin
L := Length(Hex);
Sum := 0;
For I := 1 to L Do
   Begin
   Sum := Sum * 16;
   If ( Ord(Hex[I]) >= Ord('0')) and (Ord(Hex[I]) <= Ord('9')) then
      Sum := Sum   Ord(Hex[I]) - Ord('0')
   else If ( Ord(Hex[I]) >= Ord('A') ) and (Ord(Hex[I]) <= Ord('F')) then
      Sum := Sum   Ord(Hex[I]) - Ord('A')   10
   else If ( Ord(Hex[I]) >= Ord('a') ) and ( Ord(Hex[I]) <= Ord('f')) then
      Sum := Sum   Ord(Hex[I]) - Ord('a')   10
   else
      Begin
      Sum := -1;
      break;
      End;
   End;
Result := Sum;
End;    end.    
mainform 是
 
DBThread := DBHandler.Create(button1click);
而每一個table 會有大約500record 我要處理的table 可能是要100 個
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-05 23:14:33 IP:218.174.xxx.xxx 未訂閱
tdatabase的handleshared是否有設定?
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-06 10:45:29 IP:218.103.xxx.xxx 未訂閱
" tdatabase的handleshared是否有設定?" 請問這個有什麼用途呢? 要怎樣用呢? 這個對我現在的應用是有什麼的影響呢? 請大大講解一下謝謝
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-06 21:42:02 IP:218.170.xxx.xxx 未訂閱
按f1先看看help 會比較清楚喔
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-09 11:45:34 IP:218.103.xxx.xxx 未訂閱
引言: 按f1先看看help 會比較清楚喔
已經看過
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-09 21:38:50 IP:211.74.xxx.xxx 未訂閱
之前說過在使用Synchronize的源碼,要儘量減化!!~包函Sleep等指令~~
你可測試一下,你在Synchronize源碼內執行的時間,及每次在執行緒內while內的時間.......    procedure Execute;
begin
  while true do begin
    Synchronize(Temp);
    Sleep(500); //每次給FORM 0.5秒的時間QK
  end;
end;    procedure Temp;
begin
  d:=TimeGetTime;
  Sleep(1000); 
  //<-至少form就會在這兒等待1秒了..
  //另外還包括請他的程序,請儘量減化
  A:=TimeGetTime-d; //這個程序共用了多少時間(這樣讓表格停住的時間)
end;
ps.請多看點書ok!!
系統時間:2024-05-17 11:09:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!