2014-02-08 62 views
2

我想開發一個C++ MFC應用程序在後臺運行(在Windows中),我有一個問題,我找不到完整的答案。如何檢測殺死進程事件,計算機的關閉和計算機的崩潰

我該如何檢測用戶何時試圖通過任務管理器關閉它,通過關閉計算機以及何時該應用程序運行崩潰的計算機關閉進程?

知道我有一個外部數據庫(SQL Server 2008)與此應用程序交互。

+0

當計算機處於關機和用戶的好評過程不要強迫它,我想只是WM_QUIT消息正在發送,所以你可能會發送一些東西到你的數據庫在這種情況下,但最好在這之後關閉應用程序。在其他情況下,我想除了檢測到你的應用程序突然停止響應之外,你什麼也做不了。 – Predelnik

+0

關於第一個問題,有兩種方法可以通過任務管理器關閉進程。一個可以通過該過程檢測到,另一個不可以。如果後者被使用,你的應用程序是烤麪包。這是設計。你可以有獨立的看門狗應用程序,但誰看着看門狗?關於你最後的問題,當電腦崩潰時,它最糟糕的方式是故障。你在問如何燒烤烤麪包。你不能。 –

+1

@DavidHammen @DavidHammen,我有一個想法,但我不確定,我認爲應用程序會每30分鐘ping SQL Server,並且我會開發另一個模塊,該模塊在該服務器中運行,監聽每個ping,並且如果沒有ping 30分鐘後它只會在數據庫中添加一條新的行,你怎麼看? –

回答

0

您可以像上面建議的那樣處理WM_QUIT。 還有WM_QUERYENDSESSION及其系列。

對於沒有GUI的服務,使用RegisterServiceCtrlHandlerEx來獲得通知。另一方面,要攔截當你自己的應用程序崩潰時,你會混淆結構化的異常處理程序,但是當它發生時,你可能沒有可靠的數據。

最後,當電腦本身出現故障時,您無法做任何事情,這種行爲根本就是未定義的。

無論如何,你不能確保有一個健康的數據庫會話,有無限的理由,即使空閒太久,你可能會丟失數據庫會話。

您應該設計系統具有極端的角落情況下,一些容錯,如使用事務,回退機制,可追溯的記錄當它擊中風扇等