優秀的資料庫應用應當充分考慮資料庫訪問的速度問題。通常可以通過優化資料庫、優化 查詢語句、分頁查詢等途徑收到明顯的效果。即使是這樣,也不可避免地會在查詢時閃現乙個帶有 sql符號的沙漏,即滑鼠變成了查詢等待。最可憐的是使用者,他(她)在此時只能無奈地等待。遇到急性子的,乾脆在此時嘗試 windows中的其它應用程式,結果致使你的資料庫應用顯示一大片白色的視窗。真是無奈!
本文將以簡單的例子告訴你如何實現執行緒查詢。還等什麼,趕快開啟delphi對照著下面的完整源**試試吧。
在查詢時能夠做別的事情或者取消查詢,這只是基本的執行緒查詢,在你閱讀了delphi有關執行緒幫助之後能立刻實現。這裡介紹的是多個執行緒查詢的同步進行。
在delphi資料庫應用中,都有乙個預設的資料庫會話 session。通常情況下,每個資料庫應用中只有這乙個會話。無論是查詢函式修改資料,在同一時間內只能進行其中的一件事情, 而且進行這一件事情的時候應用程式不能響應鍵盤、滑鼠以及其它的 windows訊息。這就是在 視窗區域會顯示一片空白的原因所在。當然,只要將查詢或資料操縱構造成執行緒物件,情況會好一些,至少可以接受視窗訊息,也可以隨時終止查詢或資料操縱,而不會在螢幕上顯示出太難看的白色。不過,這只是解決了問題的一部分。假如在進行乙個執行緒查詢的時候,使用者通過 按鈕或選單又發出了另乙個查詢的命令,這可如何是好,難道終止正在執行的資料庫訪問嗎? 解決之道就是:多執行緒同步查詢。
下面的例子只實現了靜態的執行緒同步查詢,即執行緒物件是固定的,並隨窗體的建立和銷毀 而建立和銷毀。你可以就此進行改進,為每乙個資料查詢或資料操縱命令建立乙個單獨的執行緒物件,從而達到多執行緒同步查詢的目的。
注意:應用程式中的執行緒不是越多越好,因為執行緒將嚴重吞噬cpu資源,儘管看上去並不明顯。謹慎建立和銷毀執行緒將避免你的應用程式導致系統資源崩潰。
下面的例子給出了同時進行的兩個執行緒查詢。第一次按下按鈕時,執行緒開始執行;以後每次按下按鈕時,如果執行緒處於掛起狀態則繼續執行,否則掛起執行緒;執行緒執行完畢之後將連線 datasource,查詢結果將顯示在相應的dbgrid中。
unit unit1;
inte***ce
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
db, dbtables, grids, dbgrids, stdctrls;
type
tform1 = class(tform)
session1: tsession;
database1: tdatabase;
query1: tquery;
datasource1: tdatasource;
dbgrid1: tdbgrid;
session2: tsession;
database2: tdatabase;
query2: tquery;
datasource2: tdatasource;
dbgrid2: tdbgrid;
btngopause: tbutton;
procedure formcreate(sender: tobject);
procedure formdestroy(sender: tobject);
procedure btngopauseclick(sender: tobject);
private
public
end;
tthreadquery = class(tthread)
private
fquery: tquery;
fdatasource: tdatasource;
procedure connectdatasource;
protected
procedure execute; override;
public
constructor create(query: tquery;
datasource: tdatasource); virtual;
end;
var
form1: tform1;
q1,
q2: tthreadquery;
implementation
procedure tthreadquery.connectdatasource;
begin
fdatasource.dataset := fquery;
end;
procedure tthreadquery.execute;
begin
try
fquery.open;
synchronize(connectdatasource);
except
showmessage('query error');
end;
end;
constructor tthreadquery.create(query: tquery; datasource: tdatasource);
begin
fquery := query;
fdatasource := datasource;
inherited create(true);
freeonterminate := false;
end;
procedure tform1.formcreate(sender: tobject);
begin
q1 := tthreadquery.create(query1, datasource1);
q2 := tthreadquery.create(query2, datasource2);
end;
procedure tform1.formdestroy(sender: tobject);
begin
q1.terminate;
q1.destroy;
q2.terminate;
q2.destroy;
end;
procedure tform1.btngopauseclick(sender: tobject);
begin
if q1.suspended then q1.resume else q1.suspend;
if q2.suspended then q2.resume else q2.suspend;
end;
end.
執行緒!執行緒!!執行緒!!! Delphi版
以下內容僅供初學者參考 看到有的同學對delphi的執行緒認識不夠深,特開一貼給同學們講講。主要給出兩種常用的執行緒形式。1 長等待型執行緒示例,等待命令,執行不定長的工作,但每個工作的時間不會太長。2 長工作型執行緒示例,執行乙個很長時間的工作,但可以很快響應取消操作。以下程式所用的知識為 訊息機...
delphi 多執行緒
摘自 萬一的部落格 functionmyfun p pointer integer stdcall var i integer begin fori 0to500000do begin form1.canvas.lock form1.canvas.textout 10,10,inttostr i f...
delphi 多執行緒
看別人的部落格一萬次記憶效果也沒那麼好,還是自己動手寫寫吧!functioncreatethread lpthreadattributes pointer dwstacksize dword lpstartaddress tfnthreadstartroutine lpparameter point...