線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:996
推到 Plurk!
推到 Facebook!

視窗傳值並寫入DB 程式效能低落

缺席
rakce
一般會員


發表:1
回覆:0
積分:0
註冊:2006-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-10-29 11:36:35 IP:60.251.xxx.xxx 訂閱
有一程式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;
------
_
 _
  _ ○
   _  ﹀□﹀
    _ 《︾
學習就像走樓梯,一步一步慢慢來

系統時間:2017-10-17 7:44:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!