網上查了很多資料,看了很多關於執行緒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 長工作型執行緒示例,執行乙個很長時間的工作,但可以很快響應取消操作。以下程式所用的知識為 訊息機...