Prog qui disparait de la liste des Applications

Prog qui disparait de la liste des Applications - VB/VBA/VBS - Programmation

Marsh Posté le 22-08-2005 à 11:27:44    

Hello,
 
J'ai un petit prog qui tourne en tâche de fond sur un PC (une Form avec Visible=False).
Dans le Gestionnaire des tâches de Windows il apparaît dans la liste des Applications et dans celle des Processus. Là tout va bien.
 
Mais voila au bout d'un certain temps le prog disparait de la liste des Applications et n'apparaît plus que dans la liste des processus !!!  :heink:  
Cela me pose un pb car l'API (GetDesktopWindow) incluse dans ce programme qui permet de faire une capture d'écran ne fonctionne plus une fois que le prog n'est plus dans la liste des Applications.
 
Si qq à une idée sur ce basculement j'suis preneur !
Merci

Reply

Marsh Posté le 22-08-2005 à 11:27:44   

Reply

Marsh Posté le 22-08-2005 à 13:39:05    

C'est tout simplement parce que ton programme s'est terminé.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 22-08-2005 à 15:03:49    

Terminé ??! Mais il ne fait rien (si il ecoute sur un port).
D'ailleurs le code ne comporte aucun End ou Form Unload.
Ce n'est qu'une simple Form avec le parametre Visible à False.
 
D'ailleur j'ai merdé pour les API j'en utilise 3 pour faire la capture et la convertir en tableau de byte :
GetDesktopWindow
BitBlt
GetDIBits
 
Ce programme n'a pas de "Fin".


Message édité par M@el le 22-08-2005 à 15:05:05
Reply

Marsh Posté le 22-08-2005 à 17:08:16    

Et pourtant... s'il n'est pas dans le gestionnaire des tâche, c'est qu'il ne tourne pas / plus.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-08-2005 à 10:27:54    

Si il tourne puisqu'il est toujours dans la liste des processus et que je ne peux pas supprimer l'exe !!!!
 
En fait au lieu d'apparaître dans la liste des Applications ET des Processus, il n'apparaît plus que dans les Processus.
 
Une fois dans les Processus uniquement là il ne fonctionne plus correctement (la capture d'écran ne renvoie rien, l'image obtenue correspond à la couleur du controle qui reçois la capture).
 
Vois tu ce que je veux dire ?

Reply

Marsh Posté le 23-08-2005 à 10:32:29    

Ah... je me fie jamais à la liste des application, je pensais que tu parlais de la liste des process.
Je sais pas ce qu'il fait ton programme. Faut bien tout tester les valeurs de retour, vérifier que y'a pas de fuites, etc...
GetDesktopWindow() ne peut pas échouer à ma connaissance. Qu'est-ce qui te fait dire ça ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-08-2005 à 12:02:59    

Il ne fait rien de bien compliqué :  
 
Le prog se lance sous form d'une Form avec Visible=False
Puis il ecoute sur un Port
A la reception d'une connexion
Il stop l'ecoute
La forme s'affiche sous forme d'un tout petit carré blanc en haut à gauche de l'écran
le prog obtien le handle du bureau avec GetDesktopWindow
A partir du handle obtien le DeviceContext avec GetDC
Réalise une capture d'ecran et la place dans un picturebox avec BitBlt
Libére les ressources du Device Machin avec ReleaseDC
Place l'image dans un tableau de Byte avec GetDIBits
Envoie le tableau et l'en tête au poste qui a demandé la capture pour affichage.
Recommence à écouter sur le port.
 
Quand ça merde je reçois une image remplie avec la couleur de fond du PictureBox (rouge).
 
Le prog est controlé par Win sous forme d'une tache planifié qui le relance le prog toutes les 5 minutes. Si le prog tourne déjà la nouvelle instance s'auto-kill (là il y a bien un End)  :ange: .
 
Ca fait chier, je vais devoir faire un log sur l'exe car en Dev bien sur je n'ai jamais de pb.  :fou:  
 
J'ai testé avec et sans affichage de la form sous forme de carré blanc c'est pareil, idem sans le ReleaseDC.
 
Je me demande si le pb ne vient pas de la tache planifiée car il apparaît toujours le lendemain (le pb), exemple si je lance le prog aujourd'hui je n'aurais de pb potentiellement que demain. Le prog tourne sur 8 postes et en générale j'en ai un sur 8 qui merde le lendemain. Bien sur c'est pas toujours le même. Quand ça merde je fait Ctrl+Alt+Sup, je vais dans les processus et je le kill, 5 minute plus tard la tâche la relance et là je suis tranquille pour la journée.
 
La tâche planifiée lance le prog toutes les 5 mn de minuit à 23h59 tous les jour.
 
 :??:


Message édité par M@el le 23-08-2005 à 12:09:24
Reply

Marsh Posté le 23-08-2005 à 13:57:37    

Ou alors tu as simplement uen fuite de ressources GDI, et quand ça sature ça merde. Pour que ça sature, il faut un certain nombre d'exécutions / screenshot.
Fait un test en exécutant ton code de capture en boucle.
Trace la consommation mémoire, et analyse l'utilisation des ressources GDI avec ça:
http://msdn.microsoft.com/msdnmag/ [...] fault.aspx
Si y'a un compteur qui ne fait que grimper, tu as trouvé le problème.
Inspire toi de ce code:
http://support.microsoft.com/defau [...] -us;161299


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-08-2005 à 14:49:59    

OK merci j'vais regarder ça.
[Edit]
J'ai viré tout mon ancien code de capture d'écran (avec Release machin) et remplacé par celui de tu m'as indiqué.
Je balances tout ça et je te dis demain ce qu'il en est.  :)  
 
Merci :hello:


Message édité par M@el le 23-08-2005 à 15:04:51
Reply

Marsh Posté le 23-08-2005 à 15:57:02    

Tu peux pas le relancer toutes les secondes au lieu de toutes les 5 minutes ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 23-08-2005 à 15:57:02   

Reply

Marsh Posté le 23-08-2005 à 17:00:54    

Re
 
Il n'y a pas une capture toutes les 5 minutes les captures sont faites à la demande d'un autre soft qui les reçoist et les affiche. Ce prog est installé que sur une seule machine. Ca permet de voir si tous ce passe bien sur les postes pilotant des automates sans avoir à se lever et c'est bcp moins lourd que PC Anywhere.
 
Les postes, on va dire "à surveiller", relancent l'appli (celle qui fait la capture et l'envoie) toutes les 5 mn au cas où elle ne tournerait plus suite à un plantage ou un redemarrage du poste.
 
Je viens de faire un test en ajoutant une petit boucle dans le prog qui demande la capture d'écran et qui l'affiche.
 
J'ai demandé et obtenue 1000 captures à 300 MiliSec d'intervale sans aucunh pb. Je vais bien voir demain si ça a tenu le coup.
 
La mémoire consommée par le prog (celui qui fait la capture) varie entre 4.8 Mo et 14 Mo, mais une fois la capture terminée il retombe toujours à 4.8 Mo.
 
J'ai fait ces tests avec la nouvelle version de programme dans lequelle j'ai modifié les API de captures pour utilisé celle du lien de ton post.
 
Demain je testerais la demande de 1000 captures sur l'ancienne version pour voir si elle tenait le coup et si le pb venait bien des API.
 
Merci  :hello:


Message édité par M@el le 23-08-2005 à 17:02:51
Reply

Marsh Posté le 24-08-2005 à 09:42:25    

Bon,
 
Je ne suis pas sur le site de production, mais sur les 8 postes j'ai deux écran noir (au lieu de rouge... beau progrés), manifestement le pb est tjrs là... Le prog tourne bien puisque la connexion s'établie, par contre la capture part en sucette.
 
Je serais probablement sur le site demain. Je vais voir ce qui ce passe si je vire la tache planifée.
 
C désolant quand même...

Reply

Marsh Posté le 24-08-2005 à 09:46:00    

Moui. La fuite peut se situer ailleurs. Pour être fixé, analyse la consomation des objets GDI avec le lien donné.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 24-08-2005 à 13:22:43    

c'est un prog de style vnc ?
si c'est le cas, alors dans ta partie serveur, met un timer à 1 minute pour l'envoie des images en continu.
Ne te sert pas de ta fenetre pour faire une capture mais d'une API Windows de copie d'ecran. va faire un tour sur vbfrance.com


---------------
now : do nothing
Reply

Marsh Posté le 25-08-2005 à 10:03:34    

Ce prog ne prend pas la main sur la machine, il ecoute sur un port et envoie une capture au PC qui lui a demandé.
 
J'utilise bien une API pour faire la capture. Le code vient de de chez Crosoft il utilise les API :
GetWindowDC + CreateCompatibleDC + CreateCompatibleBitmap + SelectObject + GetDeviceCaps + BitBlt + DeleteDC + ReleaseDC.
 
J'ai déjà épuré VB France...
 
Merci Qd même.

Reply

Marsh Posté le 25-08-2005 à 19:21:16    

fait voir une routine qui toutes les 5 min fait une capture et la stocke (et suppr l'autre) pour faire tourner le programme.


---------------
now : do nothing
Reply

Marsh Posté le 26-08-2005 à 08:56:46    

J'ai déjà fait qq chose du même style :
 
J'ai demandé et obtenue 1000 captures à 300 MiliSec d'intervale sans aucunh pb.
 
Aujourd'hui aucun des postes n'a merdé... étrange.

Reply

Marsh Posté le 26-08-2005 à 16:12:05    

Fait une présentation du soft au client, là t'es sûr que ça merdera :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 29-08-2005 à 09:56:53    

lol

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed