none
Winform avec notifyIcon : manque de mémoire sous Vista, pas sous XP (anciennement : Pour surveillance de sortie de veille)

    Question

  • Bonjour tout le monde,

    Pour relancer l'application PopTray qui surveille les mails de l'utilisateur, j'ai écrit une application pour lui envoyer une combinaison de touches lorsque la machine sort de veille.

    Le principe est de suspendre l'exécution par Thread.Sleep(10000), et de comparer ensuite l'heure qu'il est avec ... dix secondes après l'heure qu'il était avant le Sleep. Si il s'est écoulé plus de dix secondes, c'est que la machine s'est mise en veille.

    Il pourrait y avoir à critiquer en ce sens que je mets un délai de timer légèrement plus court que ce qu'il faut pour exécuter son code, de façon à en avoir toujours un en cours d'exécution, sinon il ne se passe rien au réveil si la mise en veille s'est faite en dehors du Thread.Sleep. Pendant les tests j'ai mis un MessageBox pour éviter les exécutions successives, en fait une fois que je l'enlève le test a donné deux flèches successives sur le formulaire.

    Sur la machine de développement sous Windows XP Home SP3, ça fonctionne bien, avec bien sûr toutefois un délai de réponse de dix secondes pour rafraîchir l'affichage. Je n'ai pas pu vérifier l'effet sous PopTray, mais je vois bien la flèche apparaître dans la zone de texte.

    Arrivé sur la machine de l'utilisateur, sous Vista familial basique, les choses se gâtent. Déjà la copie s'éternise, et en plus à l'exécution ça se referme tout de suite, alors j'ouvre ça depuis une ligne de commande pour pouvoir avoir un retour, et on me dit "Program too big to fit in memory".

    Alors je me demande de quelle mémoire il s'agit : le programme fait 500 ko (incluant des icônes), la machine XP a 1 Go de mémoire, celle sous Vista le triple (et accessoirement un processeur plus puissant).

    L'application comporte aussi une notifyIcon pour éviter d'occuper de la place.

    Ah la machine cible a déjà .Net, donc pour le déploiement je ne me suis pas cassé la tête, j'ai mis l'exécutable sur une carte mémoire, pour le copier vers un répertoire du disque.

    Est-ce que je mets ici le code du formulaire, ou est-ce que j'ai oublié un point essentiel lié au changement de système ? J'ai pourtant transféré d'autres programmes entre les deux mêmes machines. Ils étaient en mode console il est vrai, alors que celui-ci a un formulaire à afficher.





    • Modifié Gloops lundi 4 juillet 2016 13:04
    dimanche 3 juillet 2016 11:46

Réponses

  • Pour finir non, je n'ai pas eu besoin d'écrire un programme d'installation.

    Pour ce qui est du clic sur l'infobulle de l'icône dans la zone de notification il y a une particularité pour Windows 2000, ai-je lu là, mais pour ce qui est d'afficher ladite icône, si ça marche sous XP ça doit marcher sous Vista.

    Alors la solution est bien plus basique que ce qui a été évoqué : je me suis rappelé que try catch c'est fait pour gérer des erreurs, j'ai mis ça autour des deux instructions qui modifient la propriété Visible de la notifyIcon, et puis terminé, le try catch n'est même pas appelé, il suffit qu'il soit présent.

    Il reste un autre problème mais là ce n'est plus vraiment le même sujet et il existe un forum dédié : j'ai appris à créer un bouton sur la barre de titre pour réduire le formulaire en icône de notification, et si ceci fonctionne très bien sous XP, ça ne s'avère pas compatible en l'état sous Vista.

    Mais au moins, depuis que j'ai mis mon try catch, mon formulaire s'ouvre proprement sous Vista sans même avoir à trifouiller du côté du mode de compatibilité. Toutefois, cet élément est à avoir présent à l'esprit lorsqu'un programme fonctionne sous XP et pas sous Vista, voir ci-dessous réponse de Teodora Sharkova.





    • Marqué comme réponse Gloops lundi 4 juillet 2016 14:26
    • Modifié Gloops lundi 4 juillet 2016 14:36
    lundi 4 juillet 2016 14:25

Toutes les réponses

  • Bonjour Gloops,

    Veuillez consulter le thread suivant :
    Solved... I have one program that errors with "Program too big to fit in memory"... runs fine in XP Pro
    Je vous remercie par avance de votre retour.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 4 juillet 2016 09:54
    Modérateur
  • Bonjour,

    Ah, oui, on parle de "installer properties", donc en copiant juste l'exécutable j'ai carrément sous-calibré le boulot.

    J'ai essayé de créer un raccourci pour y sélectionner le mode compatibilité avec Windows XP SP2 (le seul proposé), ça m'a ouvert le formulaire une fois, et puis ensuite quand il était supposé se retrouver en icône dans la zone de notification, plus personne. Lors d'une nouvelle tentative, même plus de première apparition du formulaire.

    Apparemment il faut que j'essaie en créant un programme d'installation.

    Il se peut aussi que je doive approfondir un peu plus : en lecture diagonale j'ai vu une méthode de notifyIcon marquée "deprecated" pour Vista, peut-être faudra-t-il une approche légèrement différente ?

    Du coup je vais modifier le titre, quitte à m'apercevoir après que c'était une erreur.



    • Modifié Gloops lundi 4 juillet 2016 13:10 correction sur l'emplacement de l'icône : pas la barre des tâches
    lundi 4 juillet 2016 13:03
  • Pour finir non, je n'ai pas eu besoin d'écrire un programme d'installation.

    Pour ce qui est du clic sur l'infobulle de l'icône dans la zone de notification il y a une particularité pour Windows 2000, ai-je lu là, mais pour ce qui est d'afficher ladite icône, si ça marche sous XP ça doit marcher sous Vista.

    Alors la solution est bien plus basique que ce qui a été évoqué : je me suis rappelé que try catch c'est fait pour gérer des erreurs, j'ai mis ça autour des deux instructions qui modifient la propriété Visible de la notifyIcon, et puis terminé, le try catch n'est même pas appelé, il suffit qu'il soit présent.

    Il reste un autre problème mais là ce n'est plus vraiment le même sujet et il existe un forum dédié : j'ai appris à créer un bouton sur la barre de titre pour réduire le formulaire en icône de notification, et si ceci fonctionne très bien sous XP, ça ne s'avère pas compatible en l'état sous Vista.

    Mais au moins, depuis que j'ai mis mon try catch, mon formulaire s'ouvre proprement sous Vista sans même avoir à trifouiller du côté du mode de compatibilité. Toutefois, cet élément est à avoir présent à l'esprit lorsqu'un programme fonctionne sous XP et pas sous Vista, voir ci-dessous réponse de Teodora Sharkova.





    • Marqué comme réponse Gloops lundi 4 juillet 2016 14:26
    • Modifié Gloops lundi 4 juillet 2016 14:36
    lundi 4 juillet 2016 14:25
  • Bonjour tout le monde,

    Pour relancer l'application PopTray qui surveille les mails de l'utilisateur, j'ai écrit une application pour lui envoyer une combinaison de touches lorsque la machine sort de veille.

    Le principe est de suspendre l'exécution par Thread.Sleep(10000), et de comparer ensuite l'heure qu'il est avec ... dix secondes après l'heure qu'il était avant le Sleep. Si il s'est écoulé plus de dix secondes, c'est que la machine s'est mise en veille.


    Dans l'absolu ça marche, mais des Thread.Sleep dans le code d'un Timer supposent des tâtonnements fins : trop courts la mise en veille peut passer en dehors donc c'est raté, trop long on aboutit à une StackOverflowException au bout de quelques heures, une fois que ça marche l'antivirus se réveille sur les problèmes de sécurité que j'ai mentionnés (dans un autre fil où il est question de SendKeys : Combinaison de touches sous Vista).

    J'avais fait une recherche sur la question de la surveillance de mise en veille il y a quelques semaines et j'étais tombé sur quelque chose de peut-être encore plus sophistiqué, à base de tester l'état de l'écran.

    En définitive, le changement d'état de la machine au regard de son alimentation est traité par Microsoft.

    A partir d'ici : Win32_PowerManagementEvent class on trouve la base de ce script :

    Set colMonitoredEvents = GetObject("winmgmts:")._
     ExecNotificationQuery("SELECT * FROM Win32_PowerManagementEvent")
    Do
     Set strLatestEvent = colMonitoredEvents.NextEvent
     Wscript.Echo strLatestEvent.EventType 
     WScript.Echo Time
     WScript.Echo "."
     If strLatestEvent.EventType = "7" then
      Set WshShell = WScript.CreateObject("WScript.Shell")
      WshShell.SendKeys "^{F12}"
      WScript.Echo "Mise à jour du compte de mails"
     End If
    Loop

    qui du coup demande moins de temps à développer qu'à déployer.

    Je ne m'étendrai pas sur un nom de variable commençant par str pour une structure : j'ai nommé ainsi tant de strings ...

    Un autre script à base de Shell.Run pour lancer celui ci-dessus en fenêtre cachée, et le tour est joué.

    Le mettre en liste blanche de l'antivirus par exemple, parce que les histoires de fenêtre cachée, il se méfie.

    Allez en prime peut-être une autre doc du fond de tiroir :

    Win32_PowerManagementEvent, ROOT\CIMV2



    • Modifié Gloops mercredi 6 juillet 2016 18:41
    mercredi 6 juillet 2016 18:03