• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

用Delphi编写Windows服务程序(2)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
Windows的服务是一个比较实用的功能,你的程序可以在Windows未进行登录的时候就开始运行,不受用户注销的影响,也不容易被用户误关闭。

但是编写服务也许不是一件容易的事情,幸好Delphi给我们提供了一个模板,可以很容易的编写一个标准的Windows服务程序。

首先,在Delphi内新建一个Service Application。

此时,Delphi已经给我们建好了一个Service程序的框架,我们只需要把我们的代码加到合适的位置就行了。

一般情况下,Service内需要一个线程来不断的工作,也许定时器也可以,但线程工作起来更好。

Delphi会生成一个可视化的Service容器,你可以一些必要的控件在它上面,但是由于它是服务程序,是没有界面显示的,因此不建议在上面安放Edit之类的控件,服务只是应该做处理工作的,显示界面应该由其它的程序来完成。Service控件的DisplayName属性是显示在管理工具-》服务的左边的名称的内容,而Name属性则是服务名称,当你用命令提示符来启动、停止服务时,就需要用到。

在事件OnStart内,我们应该完成启动线程的工作。

如:
 Reg:TRegistry;
LogFileName,LogPath:String;
slTemp:TStringList;

begin

CoInitialize(
nil);
Reg:
=TRegistry.Create;
Reg.RootKey:
=HKEY_LOCAL_MACHINE;
Reg.OpenKey(
'\SoftWare\BHome\Education',True);
LogPath:
=Trim(Reg.ReadString('LogPath'));
SourceConnStr:
=Trim(Reg.ReadString('SourceConnStr'));
if Trim(LogPath)='' then
LogPath:
='C:\';
Reg.CloseKey;
Reg.Free;

if RightStr(LogPath,1)<>'\' then
LogPath:
=LogPath+'\';
LogFileName:
=LogPath+FormatDateTime('yyyymmdd',Now)+'Log.txt';
Try
if not FileExists(LogFileName) then begin
slTemp:
=TStringList.Create;
slTemp.Clear;
slTemp.SaveToFile(LogFileName);
slTemp.Free;
end;
AssignFile(LogFile, LogFileName);
Append(LogFile);
Except
Started:
=False;
Exit;
End;
Started:
=True;

try
AC_Source:
=TADOConnection.Create(nil);
Q_Source:
=TADOQuery.Create(nil) ;
Q_Source.Connection:
=AC_Source;

try
AC_Source.Close;
AC_Source.ConnectionString:
=SourceConnStr;
AC_Source.Open;
SYSLog(
'与源数据库连接成功!');
DBOK:
=True;
Except
on E:Exception 
do begin
DBOK:
=False;
SYSLog(
'数据库连接失败!'+E.Message);
end;
End;

MyPHSThread :
= TPHSSendThread.Create();
MyPHSThread.FreeOnTerminate:
=True;
MyPHSThread.Priority:
= tpLower ;

end;

在OnStop事件内,我们应该停止线程,并释放打开的资源,需要注意的是当你停止线程时,一般用Terminate方法,在线程内用Terminated属性来判断是否需要结束线程,而由于是线程,和主进程是时间运行的,有可能你刚好在进行Terminate时,线程已经刚进行过Terminated判断,正在进行比较费时的处理工作,而此时主进程立即执行Terminate后就进行释放资源的工作时,会造成线程执行错误,因此应该等到线程真正的正确停止后,主进程才能进行资源释放工作。

如:

MyPHSThread.Terminate;
while __ThreadIsRun do
sleep(
1000);
AC_Source.Close;
CloseFile(LogFile);
FreeAndNil(Q_Source);
FreeAndNil(AC_Source);
CoUnInitialize;
Except
End;
Stopped:
=True;
end

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ImageBase64DatasnapImagedelphi与c#互相兼容识别发布时间:2022-07-18
下一篇:
Delphi的内存管理及内存泄露问题发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap