下面这个程序你可以试一下,如果不采用线程序来执行SumRec过程的话,在按下
Button1执行SumRec过程时Button2是无效的,而用线程执行的情况下Button2却是有效的。
这就是用线程来做的效果,如果线程的优先级设得高,它就抢得更多的CPU时间而你不能
做其它事情,如果优先级别设得低,就可以做其它事情。
另外,你的子窗体的打开方式只能用Show而不是ShowModal,用ShowModal也是不可以干
其它事情的。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean);
end;
TForm1 = class(TForm)
Button1: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
procedure SumRec;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Thrd1: TMyThread;
implementation
{$R *.DFM}
constructor TMyThread.Create(CreateSuspended: Boolean);
begin
inherited;
Priority := tpLower; //设线程的优先级为较低
end;
procedure TMyThread.Execute;
begin
FreeOnTerminate := True; //在线程中止时释放线程
Form1.SumRec; //把SumRec过程替换为你的查询过程就可以了
end;
procedure TForm1.SumRec;
var I: Integer;
begin
I:=0;
while I<1000000000 do
Inc(I,1);
MessageBox(Handle,PChar(IntToStr(I)+''),'',MB_OK);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Thrd1 := TMyThread.Create(False); //False表示一创建就开始执行线程
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage('Hello, World!');
end;
end.