2017-09-06 42 views
0

函數調用鑑於一些像這樣的代碼......防範系統的變化之間在Windows

auto res = GetScreenResolution(); 

// Can windows change the screen resolution between these calls? 
// How do you guard against it? 

DoSomething(res); 

可以在屏幕的分辨率的函數調用之間是否會改變?從用戶調整顯示設置。我認爲它可以但我會要求確定。

如果分辨率在兩次調用之間發生變化,則函數DoSomething可能無法正常工作,或者根據代碼導致嚴重問題。

有沒有什麼辦法可以確保系統(或特定設置)在執行一段代碼期間無法更改?

相同的概念可以應用於各種事情,如檢查網絡是否啓動或檢查文件的狀態。

事情發生的概率很小,不值得打擾,但我很好奇。

一些隔夜的想法...

  1. 呼叫GetScreenResolution()後再次DoSomething的(),以檢查匹配。這也可以讓你撤銷你所做的更改並改正它們。問題仍然存在,但仍然低得多。

  2. 有例外,DoSomething()可能會拋出一個軟件異常與過時的數據。然後你可以做任何必要的事情。

  3. 如果您必須在GetScreenResolution和DoSomething之間進行大量處理,比如說一分鐘,那麼可能需要檢查系統的更改。如果您收到解決更改的消息,則您也可以重置處理,如果您的體系結構允許的話。

+0

然後它發生在_check_和執行之間。只要做到這一點,併爲失敗做好準備。 – CodeCaster

回答

0

你只需要爲失敗做準備和/或確保你有任何變化的通知。

即使有鎖可以防止另一個應用程序改變顯示設置,但是沒有什麼可以做,以防止我拔出顯示器電纜和Windows對此作出反應,並使我的筆記本電腦屏幕成爲主監視器。

如果你看一下ChangeDisplaySettings比如你會看到這個MSDN上:

當顯示模式是動態變化的,該WM_DISPLAYCHANGE消息被髮送到所有正在運行的應用程序與下面的消息參數。

可以做,以防止事情的唯一的事情就是用一個job object從調用某些功能(JOB_OBJECT_UILIMIT_DISPLAYSETTINGS等)限制你的控制下的特定工藝/流程。

+0

這是不幸的,我想這個概率太小了,不用擔心。我想你只能通過多次檢查來減少發生問題的變化,而不能完全解決問題。除非在函數調用之間花費很長時間,否則不值得放棄性能或可讀性。爲了未來的讀者,我在開場白中增加了一些建議。感謝讓我知道工作對象。如果我需要的話,我會把它放在後面。 –

相關問題