private: bool stopping; int loopsleep; //毫秒 Threading::Thread* servicethread; protected: //设置好服务应做的工作 void OnStart(String* args[]) { Threading::ThreadStart* threadStart =new Threading::ThreadStart(this,mainLoop); servicethread = new Threading::Thread(threadStart); servicethread->Start(); } void mainLoop() { loopsleep = 1000; //毫秒 stopping = false; while (!stopping) { Threading::Thread::Sleep(loopsleep); } } |
void OnStop() { stopping = true; } |
如果你增加loopsleep值,则会在停止时,增加服务的响应时间。
安装服务
尽管这个服务什么也不做,但你仍可对它进行安装、启动和停止。为简化安装过程,可在工程中加入一个安装程序,这可在设计视图中完成(如果你喜欢,可在设计视图中打开属性窗口,并修改ServiceName属性;而向导会在工程名后加上WinService,这最好在添加安装程序之前完成,否则,就需要在多处修改服务名。),鼠标右键单击设计视图,选择添加安装程序。这将创建一个服务安装程序和一个服务过程安装程序,并显示在设计视图中,以供你设置它们的属性。
如果已经阅读了有关Windows服务的 .NET文档,你可能会想为什么要添加一个安装程序呢?难道不可以自动添加吗?实际上,如果是使用VB或C#,是可以自动添加的,而C++却不行。
服务过程安装程序只有一个比较让人感兴趣的属性:服务所运行的账户。单击serviceProcessInstaller1选择它,打开其属性窗口。默认情况下,账户属性为User,这意味着在安装服务时,将会提示输入一个ID和密码,而且服务将会运行于user权限下--这在服务运行于system账户时非常有用。通常有三个选项:LocalSystem是服务被安装于未运行Windows 2003的电脑上时的唯一选择;如果服务是面向Windows 2003的,那么LocalService的权限更少,因为是更好的选择;而NetworkService允许服务验证另一台电脑,所以只在需要使用它(例如,一个服务加载了一个web页),相反,在使用公共web服务时,就不需要作为NetworkService运行,因为它不需验证远程电脑。
而服务安装程序中需要注意的属性是StartType:手动、自动、禁用。在此例中为手动。
现在,可以生成服务,并准备安装了。打开Visual Studio命令提示符,定位到工程的Debug文件夹,输入以下命令:
InstallUtil CGNotifier.exe |
Microsoft (R) .NET Framework Installation utility Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. Exception occurred while initializing the installation: System.IO.FileLoadException: Unverifiable image 'CGNotifier.exe' cannot be run. |
CGNotifier.exe -Install /u |
唤醒后做一些事情
当然,以上所示的服务到目前为止并不能做任何事情,为把它变成一个"在设定时刻唤醒"的服务,第一步应在工程中加入一个配置文件,示例如下:
<configuration> <appSettings> <add key="runhour" value="22" /> </appSettings> </configuration> |
copy app.config $(ConfigurationName)\$(TargetFileName).config |
String* sHour = Configuration::ConfigurationSettings:: AppSettings->get_Item("runhour"); int runHour = System::Int32::Parse(sHour); bool rantoday = false; |
stopping = false; while (!stopping) { if (DateTime::Now.Hour == runHour && !rantoday) { //执行相应的任务 rantoday = true; } else rantoday = false; Threading::Thread::Sleep(loopsleep); } |
Diagnostics::EventLog* log ; if (! Diagnostics::EventLog::SourceExists("CGNotifierService") ) Diagnostics::EventLog::CreateEventSource("CGNotifierService",CGNotifierLog"); log = new Diagnostics::EventLog("CGNotifierLog"); log->Source = "CGNotifierService"; |
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交