DELPHI執行緒例子

2021-06-08 10:19:06 字數 3279 閱讀 9204

優秀的資料庫應用應當充分考慮資料庫訪問的速度問題。通常可以通過優化資料庫、優化 查詢語句、分頁查詢等途徑收到明顯的效果。即使是這樣,也不可避免地會在查詢時閃現乙個帶有 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...