Tôi đã xây dựng một vài dịch vụ trong Delphi 7 và không có vấn đề này. Bây giờ tôi đã bắt đầu một ứng dụng dịch vụ mới trong XE2, nó sẽ không dừng lại đúng cách. Tôi không biết nếu đó là một cái gì đó tôi đang làm sai hoặc nếu nó có thể là một lỗi trong các dịch vụ XE2.Dịch vụ Delphi XE2 không dừng đúng cách
Các thủ tục thực hiện như sau:
procedure TMySvc.ServiceExecute(Sender: TService);
begin
try
CoInitialize(nil);
Startup;
try
while not Terminated do begin
DoSomething; //Problem persists even when nothing's here
end;
finally
Cleanup;
CoUninitialize;
end;
except
on e: exception do begin
PostLog('EXCEPTION in Execute: '+e.Message);
end;
end;
end;
Tôi chưa bao giờ có một ngoại lệ, như bạn thấy tôi đăng nhập bất kỳ ngoại lệ. PostLog
lưu vào tệp INI, hoạt động tốt. Bây giờ tôi sử dụng các thành phần ADO, vì vậy tôi sử dụng CoInitialize()
và CoUninitialize
. Nó kết nối với DB và thực hiện công việc của nó đúng cách. Vấn đề chỉ xảy ra khi tôi ngừng dịch vụ này. Windows cung cấp cho tôi thông báo sau:
Sau đó, dịch vụ vẫn tiếp tục. Tôi phải dừng lại lần thứ hai. Lần thứ hai nó dừng lại, nhưng với thông báo sau:
các log file chỉ ra rằng dịch vụ đã thành công miễn phí (OnDestroy
Sự kiện này được đăng nhập) nhưng nó không bao giờ dừng lại thành công (OnStop
không bao giờ đăng nhập).
Trong mã ở trên, tôi có hai thủ tục Startup
và Cleanup
. Chúng chỉ đơn giản là tạo/phá hủy và khởi tạo/uninitialize những thứ cần thiết của tôi ...
procedure TMySvc.Startup;
begin
FUpdateThread:= TMyUpdateThread.Create;
FUpdateThread.OnLog:= LogUpdate;
FUpdateThread.Resume;
end;
procedure TMySvc.Cleanup;
begin
FUpdateThread.Terminate;
end;
Như bạn có thể thấy, tôi có một chuỗi thứ cấp đang chạy. Dịch vụ này thực sự có nhiều luồng chạy như thế này, và luồng dịch vụ chính chỉ ghi nhật ký các sự kiện từ mỗi luồng. Mỗi luồng có các trách nhiệm khác nhau. Các chủ đề đang báo cáo đúng cách và chúng cũng bị chấm dứt đúng cách.
Điều gì có thể gây ra lỗi dừng này? Nếu mã đăng tải của tôi không tiếp xúc với bất cứ điều gì, sau đó tôi có thể gửi mã hơn sau này - chỉ phải 'biến đổi' nó vì đặt tên nội bộ, vv
EDIT
Tôi chỉ mới bắt đầu dự án dịch vụ MỚI trong Delphi XE2, và có cùng một vấn đề. Đây là tất cả các mã của tôi dưới đây:
unit JDSvc;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, JDSvcMgr;
type
TJDService = class(TService)
procedure ServiceExecute(Sender: TService);
private
FAfterInstall: TServiceEvent;
public
function GetServiceController: TServiceController; override;
end;
var
JDService: TJDService;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
JDService.Controller(CtrlCode);
end;
function TJDService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TJDService.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
end;
end;
end.
Không thể là lỗi trong mã Delphi.Bạn có thể cắt giảm này xuống một bản sao tối thiểu. –
^^ +1. Có vẻ như thread của bạn không bao giờ chấm dứt, do đó thời gian chờ trong SCM – whosrdaddy
IMHO thói quen TMySvc.Cleanup là ràng buộc để tạo ra vấn đề. Bạn chấm dứt FUpdateThread nhưng bạn không biết khi nào nó thực sự bị chấm dứt. Thêm một WaitFor hoặc sử dụng một đối tượng đồng bộ để phát hiện kết thúc đúng cách. Nhìn ở đây để biết thêm thông tin: http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch5.html – whosrdaddy