Windows電源管理

來源:互聯網
上載者:User

本文轉自:http://blog.csdn.net/sad_4978/article/details/3776887感謝作者!

對於電源管理這部分功能,在做案頭軟體的時候需要經常使用。尤其是在燒錄光碟片的時候,如果使用者佈建了節電方式,那麼很可能導致光碟片燒錄失敗。因此,有必要對這部分內容進行必要的瞭解。電源管理不單純是作業系統的一個功能,必須有支援電源管理的主板,才能是作業系統發揮效能。

初識ACPI

說道作業系統的電源管理方式不能不介紹一下ACPI。它是作業系統實現電源管理的一個前提。

ACPI(Advanced Configuration Management)是1997年由INTEL/MICROSOFT/TOSHIBA提出的新型電源管理規範,意圖是讓系統而不是BIOS來全面控制電源管理,使系統更加省電。

其特點主要有:

l  提供立刻開機功能,即開機後可立即恢複到上次關機時的狀態。

l  外設(比如:光碟機)在未使用時會自動關掉電源,使用時再提供電源。

l  支援熱插拔。

 

基於上述特點又把節電分為三種方式:

l  切斷顯示器電源,保持主機持續通電。進入掛起狀態(Suspend State)後,可以通過鍵盤或滑鼠喚醒電腦。

l  作業系統把當前資訊儲存在記憶體中,只有記憶體等幾個關鍵組件通電,這時電腦處在高度節電狀態。進入掛起狀態(Suspend State)後,可以通過鍵盤或滑鼠喚醒電腦。喚醒後作業系統從記憶體中讀取資料恢複到掛起前的狀態。該方式又被稱為掛起到記憶體(Save
to ram or Suspend to ram)。

l  作業系統將當前資料存放區在硬碟上,然後自動關機。進入掛起狀態(Suspend State)後,不能通過鍵盤或滑鼠喚醒電腦,必須通過Power Key喚醒。喚醒後作業系統從硬碟中讀取資料,恢複到掛起前的狀態。該方式又被稱為掛起到硬碟(Save
to disk或Suspend to disk)。

 

前面對ACPI的基本內容進行了簡單的描述,聯絡到實際可以使用ACPI可以實現以下功能:

l  使用者可以設定外設的開關時間。

l  膝上型電腦可以在低電壓的情況下進入低功耗狀態,以保證重要的應用程式運行。

l  作業系統可以在應用程式對時間要求不高的情況下降低時鐘頻率。

l  作業系統可以根據外設和主板的具體需求為它分配能源。

l  在無人使用電腦時可以使電腦進入休眠狀態,但保證一些裝置處於工作狀態。

l  隨插即用裝置在插入時能夠由ACPI來控制。

 

對於在實際應用ACPI劃分了六種狀態。這六種狀態對電源管理做出了準確劃分。它們分別是:

S0-----正常工作狀態,所有裝置全部供電。

S1-----通過CPU時鐘控制器將CPU關閉之。其他的組件仍然正常工作。該狀態也稱為POS(Power
on Suspend)

S2----- CPU處於停止運作狀態,匯流排時鐘也被關閉。其餘的裝置仍然運轉。

S3-----作業系統把當前資訊儲存到記憶體中,只有記憶體等幾個關鍵組件通電。

S4-----作業系統把當前資訊儲存到硬碟中,這時系統主電源關閉。但硬碟仍然帶電並可以被喚醒。

S5-----關機,所有裝置全部斷電。

 

作業系統的訊息 掛起操作

在“初識ACPI”中對電源管理有了一個基本的瞭解。在軟體開發中對ACPI瞭解到這個程度已經可以了。這裡,介紹一下在Windows作業系統中作業系統是怎樣進行電源管理的,並通過什麼訊息通知應用程式。

仔細觀察Windows系統,會發現在關機時會有待機、休眠兩個選項。在英文作業系統中分別是Sleep和Hibernate。如果查閱一些資料的話,可能還會看到Stand-by。那麼Sleep、Stand-by和Hibernate如果區分呢?查閱了一下MSDN,沒有找到更好的解釋。無意間在MSDN中看到一篇早期的文章,對這三個名字做了一個說明,內容如下:

    For this discussion, the term "sleep" means that the system is on standby or is in hibernation. To an application, standby and hibernation are the same. The difference occurs in how the operating
system determines what gets powered down. The application does not need to provide any additional feedback for the operating system to make this determination.

我理解Sleep應該是Stand-by和Hibernate的統稱,但是為什麼在作業系統上顯示的是Sleep,這個就說

不清楚了。好了,暫時先不去理會它們。為了繼續這裡把Stand-by稱為待機,Hibernate稱為休眠。在Windows

系統中待機對應的是S3狀態,休眠對應的是S4狀態。

 

    到這裡已經清楚了很多東西。接下來來瞭解一下Windows系統如果電源管理事件通知給應用程式的。

在MSDN中找了WM_POWERBROADCAST這樣一個訊息。該訊息的描述:

Notifies applications that a power-management event has occurred. A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(HWND   hwnd,    // handle to window

                            UINT   uMsg,    // WM_POWERBROADCAST

                            WPARAM wParam,  // power-management event

                            LPARAM lParam); // function-specific data

通過MSDN的描述可以清楚的瞭解到應用程式通過重載WindowsProc這個函數就可以獲得電源管理的訊息。在接收到WM_POWERBROADCAST的同時,還會帶給一個Event和一組Data。通過對Event和資料的分析可以得出目前作業系統處於哪種狀態。這裡需要注意一下,這個訊息一定要通過WindowsProc 函數來取得,重載PreTranslateMessage函數對於這個訊息是無效的。

 

以Windows XP系統為基礎進行描述。當Vista系統與Windows XP存在差異時,會提取差異進行描述。

   

當作業系統準備進入S3和S4狀態時,首先會廣播WM_POWERBROADCAST訊息,同時會攜帶PBT_APMQUERYSUSPEND事件給當前正在啟動並執行應用程式。如果應用程式不對這個事件做任何處理,表示同意掛起請求。然後作業系統會發送PBT_APMSUSPEND時間,隨後作業系統馬上掛起。

 

如果某個應用程式不希望作業系統進行掛起操作,那麼當接收到PBT_APMQUERYSUSPEND訊息時可以阻止作業系統掛起,方法是return  BROADCAST_QUERY_DENY;。這個操作即可以阻止系統自行發起的掛起(使用者在電源管理部分進行的設定),也可以阻止使用者手動發起的掛起操作。

如果應用程式想在系統進入掛起狀態前進行一些處理也需要在接收到這個事件時進行處理。雖然,作業系統稍後還會發送PBT_APMSUSPEND事件過來,但是停留的時間很短。

 

如果應用程式在接收到PBT_APMQUERYSUSPEND事件時沒有阻止系統掛起,卻在PBT_APMSUSPEND事件時返回FALSE。這時,作業系統會進入掛起狀態,但馬上又恢複。所以,若想阻止作業系統進入掛起狀態,只能在接收到PBT_APMQUERYSUSPEND事件時,進行處理。

 

假如,應用程式阻止作業系統掛起,返回了BROADCAST_QUERY_DENY,隨後作業系統還會發送PBT_APMQUERYSUSPENDFAILED事件給應用程式,通知掛起失敗。

 

 

 

當作業系統從掛起狀態恢複時,仍然會使用WM_POWERBROADCAST訊息進行廣播,同時也會攜帶一個事件。事件的先後順序是PBT_APMRESUMEAUTOMATIC,PBT_APMRESUMESUSPEND。由於這兩個事件對應用程式的影響不大,這裡就不做過多的說明了。

 

Vista作業系統和Windows XP存在很大的卻別。在進入掛起狀態前,作業系統不會廣播PBT_APMQUERYSUSPEND事件,應用程式也不能阻止使用者手動發起的掛起請求。作業系統從廣播PBT_APMSUSPEND事件到掛起,只給應用程式預留了2秒中的處理時間。 當從S3狀態恢複時,只有採用鍵盤或滑鼠喚醒系統應用程式才會收到APMRESUMEAUTOMATIC事件。這需要引起開發人員的注意。

 

在Vista作業系統中雖然不能阻止由使用者手動發起的掛起操作,但是可以阻止由作業系統發起的掛起操作(使用者在電源管理方式中進行的設定)。Windows提供了SetThreadExecutionState函數可以完成這個操作。這個函數同樣適用於Windows XP作業系統。

 

某段程式需要阻止作業系統進入掛起時,可以使用下面代碼來完成。

::SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS);

當處理完成後,還要恢複作業系統的電源管理功能,使用下面程式碼完成。

::SetThreadExecutionState(ES_CONTINUOUS);

 

關機操作

當Windows系統準備關機時,會廣播WM_QUERYENDSESSION訊息。在這裡應用程式可以做關機錢的最後處理。如果響應函數返回FALSE可以阻止作業系統關機。在MSDN中,有兩個不同的描述。一個說如果在這個訊息中返回非零值會接著發送WM_ENDSESSION訊息,一個說返回零會發送WM_ENDSESSION訊息。經過實驗不論返回零還是非零在Windows XP作業系統下都會發送WM_ENDSESSION訊息,

    在Vista系統中如果在WM_QUERYENDSESSION訊息的響應函數中返回FALSE,作業系統會彈出一個Block,然後由使用者選擇Yes Or No。當使用者選擇Yes,那麼系統進行關機操作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.