2017-09-06 4 views
0

Compte tenu du code comme ça ...contre les changements Gardiennage système entre appels de fonction dans Windows

auto res = GetScreenResolution(); 

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

DoSomething(res); 

la résolution de l'écran peut être changé entre les appels de fonction? Dites de l'utilisateur en ajustant les paramètres d'affichage. Je suppose que cela peut, mais je vais demander la certitude.

Si la résolution est modifiée entre les appels, la fonction DoSomething peut ne pas fonctionner correctement ou provoquer un problème majeur en fonction du code. Y a-t-il moyen de s'assurer que le système (ou les paramètres particuliers) ne peut pas être changé pendant l'exécution d'un code?

Le même concept pourrait être appliqué à diverses choses, comme vérifier si un réseau est en cours ou vérifier l'état d'un fichier.

La probabilité que quelque chose se passe est si petite que cela ne vaut pas le coup de s'en soucier, mais j'étais curieux.

Quelques réflexions nuit ...

  1. Appel GetScreenResolution() après DoSomething() pour vérifier un match. Cela vous permettrait également d'annuler les modifications que vous avez apportées et de les corriger. Il est toujours possible qu'un problème se produise, mais c'est beaucoup plus bas encore.

  2. Avec des exceptions, DoSomething() peut lancer une exception logicielle avec des données obsolètes. Vous pouvez alors faire tout ce qui est nécessaire.

  3. Si vous devez effectuer beaucoup de traitement entre GetScreenResolution et DoSomething, par exemple pendant une minute, il peut être utile de vérifier les modifications apportées au système. Si vous recevez un message indiquant que la résolution a été modifiée, vous pouvez également réinitialiser le traitement si votre architecture le permet.

+0

Et puis il se passe entre le _check_ et l'exécution. Faites-le et préparez-vous à l'échec. – CodeCaster

Répondre

0

Vous devez juste vous préparer à l'échec et/ou vous assurer que vous êtes averti de tout changement. Même s'il y avait un verrou que vous pouviez prendre pour empêcher une autre application de modifier les paramètres d'affichage, vous ne pouvez rien faire pour m'empêcher de sortir mon câble moniteur et Windows réagit à cela et fait de mon écran portable le moniteur principal .

Si vous regardez ChangeDisplaySettings par exemple, vous verrez ceci sur MSDN:

Lorsque le mode d'affichage est modifié de manière dynamique, le message WM_DISPLAYCHANGE est envoyé à toutes les applications en cours d'exécution avec les paramètres de message suivants.

La seule chose que vous pouvez faire pour éviter que quelque chose est d'utiliser un job object pour limiter un processus/processus spécifiques sous votre contrôle d'appeler certaines fonctions (JOB_OBJECT_UILIMIT_DISPLAYSETTINGS etc.).

+0

C'est malheureux, et je suppose que la probabilité est trop petite pour s'inquiéter. Je suppose que vous pouvez seulement réduire les changements de problèmes survenant en faisant plusieurs vérifications, pas complètement le résoudre.Si vous ne prenez pas beaucoup de temps entre les appels de fonction, cela ne vaut pas la peine d'abandonner les performances ou la lisibilité. J'ai ajouté des suggestions au post d'ouverture pour le bien des futurs lecteurs. Merci de m'avoir fait connaître les objets de travail. Je garderai ça dans le dos au cas où j'en aurais besoin. –