【问题标题】:Guarding against system changes between function calls in Windows防止 Windows 中函数调用之间的系统更改
【发布时间】:2017-09-06 09:39:19
【问题描述】:

给定一些这样的代码......

auto res = GetScreenResolution();

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

DoSomething(res);

可以在函数调用之间更改屏幕的分辨率吗?从用户调整显示设置说。我认为它可以,但我会要求确定。

如果在调用之间更改了分辨率,则函数 DoSomething 可能无法正常工作,或者根据代码导致重大问题。

有什么办法可以确保在一段代码执行期间不能更改系统(或特定设置)?

同样的概念可以应用于各种事情,比如检查网络是否启动或检查文件的状态。

发生某事的可能性很小,不值得打扰,但我很好奇。

一夜之间的一些想法......

  1. 在 DoSomething() 之后再次调用 GetScreenResolution() 以检查匹配项。这也将允许您撤消所做的更改并更正它们。仍然有可能出现问题,但要低得多。

  2. 如果出现异常,DoSomething()可能会抛出带有过期数据的软件异常。然后,您可以做任何必要的事情。

  3. 如果您必须在 GetScreenResolution 和 DoSomething 之间进行大量处理,比如说一分钟,那么检查系统的更改可能是值得的。如果您收到有关分辨率已更改的消息,如果您的架构允许,您也可以重置处理。

【问题讨论】:

  • 然后它发生在 check 和执行之间。去做吧,为失败做好准备。

标签: windows system reliability


【解决方案1】:

您只需为失败做好准备和/或确保收到任何更改的通知。

即使您可以采取锁定措施来阻止其他应用程序更改显示设置,但您也无法阻止我拔出显示器电缆并且 Windows 对此做出反应并使我的笔记本电脑屏幕成为主显示器。

例如,如果您查看 ChangeDisplaySettings,您会在 MSDN 上看到:

当显示模式动态改变时,WM_DISPLAYCHANGE 消息将发送到所有正在运行的应用程序,并带有以下消息参数。

您唯一能做的就是使用job object 来限制您控制下的一个或多个特定进程调用某些函数(JOB_OBJECT_UILIMIT_DISPLAYSETTINGS 等)。

【讨论】:

  • 那很不幸,我猜这个概率太小了,不用担心。我想你只能通过多次检查来减少问题的变化,而不是完全解决它。除非您在函数调用之间花费很长时间,否则不值得放弃性能或可读性。为了未来的读者,我在开篇文章中添加了一些建议。感谢您让我了解工作对象。我会记住这一点,以备不时之需。
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2012-06-25
  • 2023-03-17
  • 2022-10-17
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多