看了DELPHI deoms多线程,看的我非懂似懂的,自己做了个例子也不通!哪位大哥给个这样的例子,
在查询SQL同时,显示进度条!我知道可能用ADO的异步执行,当我这是存储过程,有大量的运算,
在查询SQL同时,显示进度条!我知道可能用ADO的异步执行,当我这是存储过程,有大量的运算,
解决方案 »
- QRmemo 如何设置其行间距啊
- DELPHI 中怎么显示svg图形
- 回家了,预祝大家新年快乐。
- 大侠们帮帮我啊,下面代码如何才能用tlist.sort排序?
- 求购DELPHI源码考勤系统一套
- RealAudio1 控件怎么使他的那个标志 不在程序中出现 logo
- rxrichedit1.seltext时不稳定,经常会出错是什么原因??
- 请教关于动态控件内存释放问题~(老问题新谈,高手请进)~~
- 200求解答??关于在控件中封装图片
- delphi6中Tidpop3控件怎么取得带附件的邮件中的正文呀?
- 求一个API函数.已知进程ID,如何判断该进程是否存在
- 问题请教:delphi 操作ACCESS数据表,通过搜索字段间接获取另一单元格中字段内容的问题
begin
FreeOnTerminate := True;
if not Assigned(OnNotify) then Exit;
repeat
Sleep(100);
OnNotify(Self);
until Terminated;
end;其中,OnNotify 是一个事件,可以定义成 TNotifyEvent。也可以用 Synchronize 把它弄成同步调用,这样更安全些。Sleep 是为了不让线程连续调用 OnNotify 事件例程,以减少 CPU 占用,因为你的目的只是隔一段时间刷新一下进度指示。把处理过程都放到事件例程中,这样可样让程序结构清晰。你那些处理过程大约都要和窗口关联,不要把那些代码和线程弄到一起。如楼上所说,显示进度不一定非用线程。用线程的好处是:当某些代码迟迟不返回时,可以让线程显示点什么,说明没有死机。
begin
resume;
end;
Screen.Cursor := crSQLWait;
qry1.Open;
Screen.Cursor := crDefault;{Thread}
constructor aa.create(p:TProgressBar);
begin
inherited create(True);
pb:=p;
end;procedure aa.Execute;
var
i:Integer;
begin
{ Place thread code here }
for i:=1 to 100 do
begin
Sleep(100);
pb.Position:=i;
end;
end;我想在 qry1.Open;执行时让进度条一直是动的,好让用户知道正在计算,为什么还是qry1.open执行完了才执行 进程aa
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Pr1: TProgressBar;
Pr2: TProgressBar;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
ABC:boolean;
implementation{$R *.dfm}procedure NEW1_Thread;//线程1函数
var
i:integer;
begin
abc:=true;
i:=1;
while i<100 do
begin
if abc then //如果abc为FALSE则中止滚动
begin
form1.Pr1.position:=i;
sleep(10);
i:=i+1;
end;
if i=100 then i:=1; //如果滚动条到达100,则再次从1开始滚动
end;
end;procedure NEW2_Thread;//线程2函数
var
i:integer;
begin
for i:=1 to 100 do
begin
//把下面两句换成你的查询语句
form1.Pr2.position:=i;
sleep(100);
end;
abc:=false;//进度条到达100,设置abc为FALSE
end;procedure TForm1.Button1Click(Sender: TObject);
var
c,d:DWord;
begin
CreateThread(nil,0,@New1_Thread,nil,0,c);
CreateThread(nil,0,@New2_Thread,nil,0,d);
end;end.此程序的效果是进度条1不断进行滚动(1~100),直到进度条2到达100;
按照你的想法就是把进度条2的滚动代码换成你的查询语句就OK了;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Pr1: TProgressBar;
Pr2: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
a,b:Thandle;
implementation{$R *.dfm}procedure NEW1_Thread;
var
i:integer;
begin
i:=1;
while i<100 do
begin
form1.Pr1.position:=i;
sleep(10);
i:=i+1;
if i=100 then i:=1;
end;
end;procedure NEW2_Thread;
var
i:integer;
begin
for i:=1 to 100 do
begin
form1.Pr2.position:=i;
sleep(100);
end;
TerminateThread(a,0); //结束线程
end;procedure TForm1.Button1Click(Sender: TObject);
var
c,d:DWord;
begin
if a<>0 then
begin
TerminateThread(a,0);
a:=0;
end;
if b<>0 then
begin
TerminateThread(b,0);
b:=0;
end;
a:=CreateThread(nil,0,@New1_Thread,nil,0,c);
b:=CreateThread(nil,0,@New2_Thread,nil,0,d);end;procedure TForm1.FormCreate(Sender: TObject);
begin
a:=0;
b:=0;
end;end.
这个线程的定义怎么和书中介绍的不一样。我的那段代码为什么不行呢,错在哪!
还是没换清楚。我在加分!还望有大虾们指点呀
var
i:Integer;
begin
{ Place thread code here }
for i:=1 to 100 do
begin
Sleep(100);
pb.Position:=i;
if Assigned(OnDisplay) then OnDisplay(Self); // 调用事件例程显示进度
end;
end;这里的 Ondisplay 是一个 TNotifyEvent 事件,需要用一个事件例程地址给它赋值。
线程有时也会暂停,那是由于线程优先级设得很低,被高优先级线程强占了 CPU 时间。
var
i:Integer;
begin
{ Place thread code here }
for i:=1 to 100 do
begin
Sleep(100);
pb.Position:=i;
if Assigned(OnDisplay) then OnDisplay(Self); // 调用事件例程显示进度
end;
end;这里的 Ondisplay 是一个 TNotifyEvent 事件,需要用一个事件例程地址给它赋值。
线程有时也会暂停,那是由于线程优先级设得很低,被高优先级线程强占了 CPU 时间。
15楼pb.Position:=i; 这句不就是显示进度吗