下面是我写的一个简单的线程试验代码,但我发现,点击Button1,执行Button1下的一段程序时,我的线程就不工作了(线程优先级我已经设为最大),一定要等到Button1下代码执行完后才能再执行。
请问有不有什么办法让我的线程一直运行,不必等待其它代码的执行?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMyThread = class(TThread)
FGo : boolean;
Fi:integer;
public
procedure Execute;override;
procedure Stop;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Button4: TButton; procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
MyThread : TMyThread;
e : boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
d:Double;
begin
e := true;
while (d<10000) and e do
begin
d:= d+0.1;
edit2.text := floattostr(d);
edit2.refresh;
end;
end;procedure TForm1.Button2Click(Sender: TObject);begin
MyThread := TMyThread.Create(true);
MyThread.Priority := tpTimeCritical;
MyThread.Resume;
end;{ TMyThread }procedure TMyThread.Execute;
begin
FreeOnTerminate := true;
FGo := true;
fi:=0;
while FGO do
begin
inc(fi);
form1.edit1.text := inttostr(fi);
form1.edit1.refresh;
sleep(1000);
end;
end;
procedure TMyThread.Stop;
begin
FGo := false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
MyThread.Stop;
MyThread := nil;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
e := false;
end;
end.
请问有不有什么办法让我的线程一直运行,不必等待其它代码的执行?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMyThread = class(TThread)
FGo : boolean;
Fi:integer;
public
procedure Execute;override;
procedure Stop;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Button4: TButton; procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
MyThread : TMyThread;
e : boolean;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
d:Double;
begin
e := true;
while (d<10000) and e do
begin
d:= d+0.1;
edit2.text := floattostr(d);
edit2.refresh;
end;
end;procedure TForm1.Button2Click(Sender: TObject);begin
MyThread := TMyThread.Create(true);
MyThread.Priority := tpTimeCritical;
MyThread.Resume;
end;{ TMyThread }procedure TMyThread.Execute;
begin
FreeOnTerminate := true;
FGo := true;
fi:=0;
while FGO do
begin
inc(fi);
form1.edit1.text := inttostr(fi);
form1.edit1.refresh;
sleep(1000);
end;
end;
procedure TMyThread.Stop;
begin
FGo := false;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
MyThread.Stop;
MyThread := nil;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
e := false;
end;
end.
解决方案 »
- 有人知道北京方正国际软件怎么样么?
- 网络断开后,本地的SQL就无法连接,这是为什么?
- 菜鸟提问:服务程序定时执行的问题!(多谢帮忙,解决后马上给分!)
- 请教delphi中的数据结构转换为c++后的表示方式
- 200分祝HT生日快乐
- qreport问题
- 急,请问cxSpreadSheet如何冻结第一行,使第一行总是显示?
- 在SQL里,我用了GROUP BY对各类物品进行分组,但是,我还想在物品分组后按入库日期进行排序,如何解决?
- 请问谁有delphi7的下载地址,谢谢了!
- ADO高手帮忙。
- 谁能告诉我delphi 5开发人员指南的光盘源代码的下载???
- 谁有ehlib和fastreport的使用资料,哪下载???
var
d:Double;
begin
e := true;
while (d<10000) and e do
begin
d:= d+0.1;
edit2.text := floattostr(d);
edit2.refresh;
Application.ProcessMessages; /// 加这一句。
end;
end;因为你在后台线程内占用了界面线程的时间,而界面线程又特别的繁忙,所以无法处理后台线程的请求,从而导致后台线程阻塞。如果你把
TMyThread.Execute; 中的两句话去掉。
form1.edit1.text := inttostr(fi);
form1.edit1.refresh;则线程不会阻塞,会一直运行下去的。验证方法,当你停止线程的时候在取出
fi的值看,是正常增长的。