Delphi使用執行緒TThread查詢資料庫

2021-07-08 19:51:30 字數 3332 閱讀 7132

網上查了很多資料,看了很多關於執行緒tthread的使用,並動手操作,但均未能達到想要的效果。我所要的效果是,執行緒執行耗時的操作而不影響主程式,使用者使用沒有卡頓的感覺。知道是使用執行緒程式設計解決,後來經過不斷的摸索,終於達到想要的效果,而**也只是二十幾行,後面直接呼叫即可。 

type

tdbquerythread = class(tthread)

private

qrytemp: tadoquery;

sqlstr: string;

public

constructor create(qry: tadoquery; strsql1: string); virtual;

procedure execute; override;   //執行緒建立後自動執行的**

end;

constructor tdbquerythread.create(qry: tadoquery; strsql1: string);

begin

inherited create(true);        // 生成執行緒物件

qrytemp := qry;                //傳遞資料集引數

sqlstr := strsql1;            //傳遞sql查詢語句

freeonterminate := true;      //完成後釋放

resume;                        // 啟動執行緒

end;

procedure tdbquerythread.execute;

begin

with qrytemp do

begin

close;

sql.text := sqlstr;

open;

end;

end;

下面是呼叫執行緒的**,建立執行緒後會自動執行執行緒的execute裡的**,只需要一行即可:

tdbquerythread.create(qry1, 'select * from dbo.t_user');

下面再新增乙個例子,三個文字分別新增文字,可以三個同進新增,多個執行緒同時執行,而不影響主程式:

unit main;

inte***ce

uses

windows, messages, sysutils, classes, graphics, controls, forms, dialogs,

grids, stdctrls, extctrls;

type

tmainform = class(tform)

pnlbottom: tpanel;

pnlbuttons: tpanel;

btngo: tbutton;

btnexit: tbutton;

mmo1: tmemo;

mmo2: tmemo;

btn2: tbutton;

btn3: tbutton;

btn4: tbutton;

mmo3: tmemo;

procedure btnexitclick(sender: tobject);

procedure btngoclick(sender: tobject);

procedure btn2click(sender: tobject);

procedure btn3click(sender: tobject);

procedure btn4click(sender: tobject);

private

public

end;

varmainform: tmainform;

implementation

uses

qryu, db, dbtables;

type

tmythread = class(tthread)

protected

mmoth: tmemo;

constructor create(mmo1: tmemo); virtual;

procedure execute; override;

end;

constructor tmythread.create(mmo1: tmemo);

begin

inherited create(true);

freeonterminate := true;

mmoth := mmo1;

resume;

//end;

procedure tmythread.execute();

vari: integer;

begin

i := 0;

while i < 5001 do

begin

mmoth.lines.add(inttostr(i));

i := i + 1;

end;

end;

varmythread: tmythread;

procedure tmainform.btn2click(sender: tobject);

varisquit: boolean;

i: cardinal;

begin

if assigned(mythread) and (not mythread.finished) then    //判斷執行緒是否結束

begin

showmessage('no finished');   //執行緒正在執行,避免衝突,彈出提示而不同時執行

endelse

begin

mythread := tmythread.create(mmo1);

end;

end;

procedure tmainform.btn3click(sender: tobject);

varmythread: tmythread;

begin

mythread := tmythread.create(mmo2);

end;

procedure tmainform.btn4click(sender: tobject);

varmythread: tmythread;

begin

mythread := tmythread.create(mmo3);

end;

procedure tmainform.btnexitclick(sender: tobject);

begin

close;

end;

procedure tmainform.btngoclick(sender: tobject);

begin

end;

end.

Delphi 多執行緒使用(1)

整理萬一部落格 執行緒學習 每個例子 均執行和使用 執行環境 我自己使用的是xe4,其他版本也可 附原始碼 什麼是執行緒 vcl執行緒的使用 tthread類 屬性freeonterminate屬性 指定當執行緒終止時是否自動刪除執行緒物件 預設 false 有的書上說是 true,建議使用時候,直...

Delphi中使用多執行緒

這些天在indy的阻塞式socket模型的強迫下,開始在delphi中使用多執行緒。總結了一些經驗,儘管非常膚淺 1 對於vcl的控制項 大部分vcl的控制項的方法和屬性是不能保證執行緒安全的。我粗淺的理解執行緒安全為如果這個函式同時被兩個執行緒呼叫時,由於內部的指令不能保證按順序 即中間插入其他執...

執行緒!執行緒!!執行緒!!! Delphi版

以下內容僅供初學者參考 看到有的同學對delphi的執行緒認識不夠深,特開一貼給同學們講講。主要給出兩種常用的執行緒形式。1 長等待型執行緒示例,等待命令,執行不定長的工作,但每個工作的時間不會太長。2 長工作型執行緒示例,執行乙個很長時間的工作,但可以很快響應取消操作。以下程式所用的知識為 訊息機...