6
votes

Empêcher l'ensemble de la mémoire de la mémoire minimisez dans l'application Console?

Je souhaite empêcher le jeu de travail de la mémoire minimiser dans l'application de la console. Dans l'application Windows, je peux faire par Remplacer les messages SC_minimize . Mais comment puis-je intercepter SC_minimize dans la demande de console? Ou, puis-je empêcher la fonction de travail de la mémoire minimiser par d'autres manières?

J'utilise Visual Studio 2005 C ++. Quelqu'un a un certain problème et la solution n'est pas agréable. :( http://www.eggheadcafe.com/ Logiciel / ASPNET / 30953826 / TRAVAIL-SET-ET CONSOLE-A.ASPX

Merci, à l'avance.


0 commentaires

6 Réponses :


1
votes

Les applications de la console ne reçoivent pas de messages de fenêtre, comme il n'y a aucun moyen de déterminer si l'application est devant l'utilisateur ou non. Vous devrez développer d'autres stratégies (peut-être une minuterie d'activité de l'utilisateur) afin de négocier la mémoire lorsque l'application n'est pas utilisée.

Vous pouvez également implémenter votre propre wrapper ressemblant à une console, mais ce n'est pas une tâche facile à obtenir correct.


0 commentaires

2
votes

Depuis que les applications de la console par défaut ne sont pas en cours d'exécution de messages, vous ne pourrez donc pas avoir accès à des messages Windows standard dans votre application de console.


4 commentaires

-1 Pour ne pas expliquer pourquoi les applications de console ne sont pas en mesure de traiter les messages de fenêtre


En fait, il est parfaitement possible d'accéder à la file d'attente du message Windows dans une application de console. Toutes les API Win32 sont disponibles pour les applications de console. Intercepter un message à l'intérieur de la boucle de messagerie WinMain fournie par Compiler-Runtime est probablement délicate et cassée, mais affichant une boîte de dialogue et le traitement des messages déjà envoyés n'est pas tout ce qui est inhabituel dans une application de console - Certaines applications de console sont également des applications GUI. Il y a probablement des API pour travailler avec la console Windows dans GUI Apps - que le temps d'exécution de la console de console standard appelle probablement.


Vous pensez - c'est pas une réponse recommandée à la question actuelle.


@George: Si vous pouvez vérifier la question, il n'a jamais demandé pourquoi la console n'a pas de boucle de message. J'ai essayé de répondre à cela dans la console, vous n'avez généralement pas de boucle de message, vous n'avez peut-être pas d'accès direct au message SC_MINIMISE. Bien sûr, vous pouvez pirater et faire une programmation de niveau inférieure pour obtenir tous les messages, mais je ne sais pas comment pertinent cela aurait été ou valant l'effort. @ Steve314: Je n'ai jamais dit que ma réponse était la meilleure ou recommandée. Vous vous rendez compte que je ne peux pas upérer mes propres réponses. Certaines personnes peuvent donc avoir apprécié le point que j'ai mentionné ici.



3
votes

SETProcessworkingSetSetSize (ex) ou utilisez virtuallock sur la plage que vous souhaitez conserver dans la mémoire physique.

Les deux affectent négativement les performances du système sous charge, mais je soupçonne que vous ne vous souciez pas de cela maintenant.


0 commentaires

0
votes

Vous pouvez utiliser un travail très sournois / hacky pour cela, ce qui pourrait être votre seul moyen: xxx

vous pouvez même jouer avec certaines des propriétés de la fenêtre à l'aide du HWND aussi bien < / p>


0 commentaires

7
votes

Set de travail de travail ne peut être empêchée que par des pages de verrouillage en mémoire, soit en les fermant explicitement avec virtuallock ou en mappant la mémoire dans Awe . Mais les deux opérations sont extrêmement privilégiées élevées et exigent que l'application exécute sous un compte accordait les «pages de verrouillage en mémoire». priviledge, voir Comment: Activez les pages de verrouillage dans l'option de mémoire . Par défaut, personne ne vene les administrateurs ne disposent pas de ce privilège.

Techniquement, c'est la réponse que vous recherchez (ommasting les détails «mineurs» de la manière d'identifier les régions à verrouiller). Mais votre question indique que vous êtes sur un trajet total total.

Le rognage de whoking Set est quelque chose qui se produit fréquemment et n'a pas d'effets indésirables graves. Vous êtes très probablement confondre la rupture de la mémoire de la mémoire, mais ce sont des phases distinctes de la vie de la page de la mémoire. La rupture se produit lorsque le système d'exploitation supprime le mappage de la page du processus et place la page dans une liste de secours. Il s'agit d'une opération très rapide et simple: la page est ajoutée à la liste de secours et au PTE est marqué en conséquence. Aucune opération IO ne se produit, la teneur physique de la RAM n'est pas modifiée. Lorsque, et si, le processus accède à la page tranchée à nouveau, une défaillance douce se produira. La TLB Mlle déclenchera une promenade dans la terre du noyau, le noyau localisera la page dans la liste de secours et la réaffectera au processus. Rapide, rapide, facile, encore une fois, aucune opération io ne se produit, ni aucun changement de contenu de RAM ne change pour la page. Donc, un processus qui a tout son jeu de travail coupé retrouvera l'ensemble de l'ensemble actif assez rapidement (microsecondes) s'il continue à référencer les pages.

Seulement lorsque le système d'exploitation a besoin de nouvelles pages pour sa liste gratuite, il examinera la liste de veille, prenez la page la plus ancienne et écrasez-la sur le disque. Dans cette situation, IO se produit et la teneur en RAM est zéro. Lorsque le processus accède à nouveau, la page A défaut difficile se produira. Le TLB Mlle va réveiller le noyau, cela inspectera la liste de la PTE et un défaut de page «réel» se produira: une nouvelle page gratuite est allouée, le contenu est lu sur le disque, puis la page est attribuée au processus et L'exécution reprend le lieu de la TLB Miss.

Comme vous pouvez le constater, il existe une énorme différence entre la rupture de l'ensemble de fonctionnement et une swap de page de pression de mémoire. Si votre demande de console est coupée, ne transpirez pas dessus. Vous ferez des dommages incalculables à la santé du système en verrouillant des pages en mémoire. Et BTW, vous faites également une mauvaise expérience utilisateur similaire en refusant de minimiser lorsqu'on la demande, simplement parce que vous comprenez malgré le cycle de vie de la page.

Il est vrai qu'il existe des processus qui ont une demande légitime pour garder leur ensemble de travail aussi chaud que possible. Tous ces processus, toujours, sont mis en œuvre en tant que services. Les services bénéficient d'une politique de coupe plus indicative du système d'exploitation et de cette stratégie est en fait configurable.

Si vous êtes vraiment préoccupé par la mémoire du système et souhaitez aider le système d'exploitation, vous devez vous inscrire à des notifications de mémoire en utilisant CreatEMemoryResourCénotification et réagissez à la pression de la mémoire en libérant vos caches et en faisant cuire vos caches lorsque vous avez notifié que la mémoire libre est disponible.


2 commentaires

C'est pour la programmation du serveur afin que je tiens à garder la mémoire aussi chaude que possible. Mais ce n'est pas desearve d'être un programme de service (il s'agit simplement de données de chargement pour d'autres programmes).


Compte tenu de votre autre question sur un fichier mappé de mémoire de 1 Go, vous savez probablement exactement la région à verrouiller. Utilisez virtuallock, mais soyez fatigué de l'impact sur le système. Empêcher la console de minimiser la console empêchera la console de minimiser, mais vous pouvez toujours perdre la mémoire à la coupe de travail. Viruallock garantira que le MMF reste en RAM. Mais encore une fois, les coûts et les conséquences peuvent bien exploiter les avantages.



0
votes

Que diriez-vous de minimiser dans le menu Système de la console? XXX PRE>

Vous pouvez également essayer de désactiver le bouton Minimize de votre fenêtre de console. P>

HWND hwnd = GetConsoleWindow(void);
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, lStyle & ~WS_MINIMIZEBOX);


1 commentaires

Je fais un projet Win32 (MSVC2005 SP1). OS est Windows XP SP3. Je mettez votre code après _tmain mais je peux minimiser ma console et la mémoire de travail est coupée.