延續之前thread 的問題 |
尚未結案
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
現在證明了那個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 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
之前說過在使用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!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |