視窗傳值並寫入DB 程式效能低落 |
缺席
|
rakce
一般會員 發表:1 回覆:0 積分:0 註冊:2006-07-31 發送簡訊給我 |
有一程式S負責處理資訊(數值運算、組DB 字串) 然後傳傳Message給程式C
程式C 在收到 Message後會PUSH至佇列 程式C在啟動時會產生一個無止盡的thread去讀取佇列,若有資料則讀取並寫入DB 程式S 可能一秒傳100個指令過來,而程式C在一秒內可以接收100個,但DB只執行了2個 目前效率低落是因為程式C 在會優先接收程式S來的指令,若中間有空檔才會去執行DB指令 都在Form FormCreate 產生一個Thread 去專門處理寫DB的動作了,為何還要停下來等接受完成且有空檔才去執行DB呢? 能否讓「接收訊息」、「寫入DB」兩個動作同時執行? 此一現象造成指令卡到幾百萬無法寫入DB..... 以下為程式片段 //產生一個執行序在FormCreate 時 procedure TfrmiWatchToDB.FormCreate(Sender: TObject); var dc:THandle; sr: TSearchRec; begin MyThread(Button1Click,nil); // 設定Thread end; procedure TfrmiWatchToDB.Button1Click(Sender: TObject);//執行序的處理 var item:TMessageItem; SQLStr: string; qcount:integer; sr: TSearchRec; begin while 1=1 do begin if qMessage.Count > 0 then begin if ActiveDBConn then begin 寫DB... end; end; end; end; procedure TfrmiWatchToDB.WMCopy(var Msg:TMessage);//接收程式S 傳來的指令 var item:TMessageItem; R:TRecMessage; P:COPYDATASTRUCT; data: string; i:integer; function GetStr(Str:String):String; var i:Integer; begin Result:=''; for i:=1 to Length(Str)do Result:=Result ':' IntToHex(Byte(Str[i]),2); end; begin P:=COPYDATASTRUCT(Pointer(Msg.lParam)^); R:=TRecMessage(P.lpData^); data :=''; for i:= 1 to R.MessageCount do begin data := data R.Message[i]; end; log('Receive and pushToQueue:Length of Data=' IntToStr(Length(data)) ' Data=[' data ']'); item := TMessageItem.Create(); item.data := data; qMessage.Push(Pointer(item)); lbQueueCount.Caption := IntToStr(qMessage.Count); end;
------
_ _ _ ○ _ ﹀□﹀ _ 《︾ 學習就像走樓梯,一步一步慢慢來 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |