程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用托管C++編寫Windows服務

用托管C++編寫Windows服務

編輯:vc教程

多年以來,只要提到編寫Windows服務,就會想到用Visual C++編寫,同時,這也是其中一件C++程序員可以做,而VB程序員不可以做的事情。以前,我們只稱其為"服務"或"NT服務",現在,它們被命名為"Windows服務",而且用VB.NET或C#也可以很容易地編寫。

但是,如果你想用托管C++來編寫呢?畢竟,大多數有經驗的Visual C++程序員都會寫過一兩個服務,也會知道怎樣完成一個類似的工程。假設你有一個必須要一直運行以提供服務的程序,且連接著一些遠程電腦,如果不想編寫一本使用手冊,告訴客戶要記得在每次重啟電腦之後重新運行此程序,你就應該使它成為一個服務;又假設你有一個用於刪除過期數據庫記錄的便利維護工具,如果不想讓管理員每周都親手運行它一次,你就應該使它成為一個服務。看起來挺吸引人的,那就讓我們開始吧。

創建服務工程

以下要做的事情非常簡單:打開Visual Studio.NET,創建一個新的工程,在Visual C++工程下,選擇Windows服務(.NET)。接下來,為這個服務取一個方便在電腦的服務列表中查找到的名字,在此為CGNotifier。向導會創建一個繼承自System::ServiceProcess::ServiceBase的類並打開設計視圖,在此,你可放入一個計時器、一個數據庫連接,或其他不可見的組件。

讓我們轉到代碼視圖中看一下生成的代碼,在此有一個構造函數與一個Dispose方法,這兩個你都可以忽略,還有一對重載的方法:OnStart()和OnStop)。在OnStart()中,可編寫服務所需的代碼。服務中一個重要的范疇是使用"事件引發對象",例如System::IO::FileSystemWatcher的一個實例,一般可在OnStart()中創建這些對象,在本例中,你可為類加入事件方法,並處理在服務運行期間,由這些對象引發的事件。另有一種服務,它們對發生的事情不作反應,只在每天或每周的特定時間,執行一些特定的任務,這些服務平時通常處於休眠狀態,但因為它們的工作狀態是持續的,所以不應該停止它們,或者可以把它們放入一個循環中,在特定的時間檢查它們是否已被停止。

OnStart()方法是服務的開始之處,並且會在執行完後返回,在此方法完成之前,服務一般不會顯示為"已啟動"。這就意味著,不能在OnStart()中放入一個經常使用的循環,或從別處直接調用的任何方法。最直接的方法是設置好一個單獨的方法,並在一個新線程中調用它,如下所示:

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);
  }
}

這個循環將會一直運行,直到服務停止,因為OnStop()設置了停止標志:

void OnStop()
{
  stopping = true;
}

如果你增加loopsleep值,則會在停止時,增加服務的響應時間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved