2017-09-06 15 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

这是不幸的,我想这个概率太小了,不用担心。我想你只能通过多次检查来减少发生问题的变化,而不能完全解决问题。除非在函数调用之间花费很长时间,否则不值得放弃性能或可读性。为了未来的读者,我在开场白中增加了一些建议。感谢让我知道工作对象。如果我需要的话,我会把它放在后面。 –