避免 Delphi 服务无响应的方法可以包括以下几个方面:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
MyThread: TMyThread;
procedure HandleThreadTerminated(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TMyThread.Execute;
begin
// 在这里进行耗时操作
// ...
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread := TMyThread.Create(True);
MyThread.OnTerminate := HandleThreadTerminated;
MyThread.FreeOnTerminate := True;
MyThread.Start;
end;
procedure TForm1.HandleThreadTerminated(Sender: TObject);
begin
// 线程执行结束后的处理
// ...
end;
end.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
Step: Integer;
procedure DoStep;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// 开始执行耗时操作
Step := 0;
Timer1.Enabled := True;
end;
procedure TForm1.DoStep;
begin
// 执行一个小步骤的操作
Inc(Step);
// ...
// 判断是否还有下一个步骤需要执行
if Step >= MaxStep then
begin
// 耗时操作执行完成
Timer1.Enabled := False;
// 继续下一步处理
// ...
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
DoStep;
end;
end.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, ShellApi;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
ProcedureHandle: THandle;
procedure DoStep;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: string;
begin
// 创建一个