Vider la pile

Signaler
Messages postés
5
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
21 février 2003
-
Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
-
Bonjoir à tous!

J'ai une question qui m'est toujours et depuis longtemps sans réponse. Je programme sous Visual C/C++ 6.0 et certain de mes programmes ont des problèmes de compatibilité (généralement tout ce qui est jeux utilisant un timer) avec les systèmes de noyau de type NT. Je pense que cela provient d'un débordement de pile qu'il me faudrait vider après l'affichage de centaines de petites bitmaps à l'écran.
Si vous connaissez le moyen de vider la pile de la mémoire, aidez moi!

Merci... . :big)

5 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Salut,
difficile de repondre sans avoir un exemple de source qui pose probleme.
La "pile" a plusieurs significations.
Celle de base est indexee par registre ESP. Faudrait voir valeur esp quand plante.
Pour les bitmap si tu les degages correctement juste apres emploi ne doit pas poser probleme.
Tu peux faire sauter la "pile d'appels" si tes timer sont mal geres. S'ils envoient un simple WM_TIMER sur un hwnd Windows assez "intelligent" pour ne pas les empiler.
Si une func callback TimerProc qui poste un message perso alors empilage et risque probleme si mauvaise gestion.
Pour resumer faut analyser un source.
On peut aussi faire un PeekMessage(..., PM_REMOVE) pour depiler dans une boucle longue. Faut voir quand et pour quel message convient.
ciao...
Messages postés
5
Date d'inscription
jeudi 20 février 2003
Statut
Membre
Dernière intervention
21 février 2003

Merci de m'avoir répondu!

Mon problème de pile ne vient pas de bitmaps non dégagées. Je pense avoir fait le nécessaire pour cela et mon programme tourne parfaitement sur Win98 ou WinMe. Le PeekMessage(..., PM_REMOVE) semble être une solution possible et j'y regarderais quand je rentrerais chez moi. Pour les sources du jeu, je veux bien les fournir sur ce site. Il s'agit du Serpent III... tadaaa! Il est (sans m'vanter bien qu'ça m'fasse plaisir de le dire) très sympa, plutôt joli et avec plein de sons à la con. En tout cas tous ceux qui y ont joué l'ont bien aimé. Le principe de l'affichage est un tableau d'entier représentant le numero d'un bitmap. La scrutation du tableau se fait par un système de boucles simple mais sous XP, elle est beaucoup trop rapide au démarrage puis devient de plus en plus lente pour finir sur un joli plantage. Je ne sais pas si je pourrais "transporter" tout le code avec toutes les bitmaps et le son mais j'essairais d'amener les .cpp et .h.

@+ j'espère!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
je suis pour l'enseignement mais en general CONTRE l'open source sur un produit complet. Donc je ne te demande pas tes sources, juste pour dire que difficile de repondre sans analyse.
Tu ne peux pas faire un genre fichier log ?
un simple pour commencer, chaque entree dans func doit ecrire:
valESP en hexa 8 char, 2 espaces et nom func \r\n
ainsi tu pourrais tracer ton prog. Au plantage tu ouvres fichier avec noteped et tu vois ou s'est arrete. C'est un exemple, suffit ensuite de modifier enrgistrement du log pour voir autres registres.
Si prob pour faire ce genre de truc, tu mets un message par ce site avec un mail ou te joindre et je te ferai cela en prive.
Je pars a l'hosto mais retour prevu vers 18h30.
ciao...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Es-tu sûr de bien libérer tous les bitmaps et autres objets GDI que tu crées ? Si tu programmes en Win32, il faut détruire tous les objets GDI quand tu n'en n'a plus besoin à la main avec la fonction DeleteObject().

Windows NT est moins tolérant que Win9X là dessus. Pour vérifier si tu détruis bien les objets, va dans ton task manager NT, sélectionnes l'onglet "Process" puis Menu "View / Select Column" et tu ajoutes "GDI Objects". Surveilles ensuite le compteur et s'il grimpe continuellement, c'est que tu n'as pas bien détruit les objets.
Attention, cette manip nécessite au mimimum W2K, sous NT tu peux la faire mais la colonne "GDI Objects" ne s'affiche pas.

Kaid
Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
8
Technique intéressante Kaid ... je vais l'essayer.
Mais si VRAIMENT Tyozhebes as besoin d'une pile plus importante, il est toujours possible de la préciser au linkeur
Sous VC++ Project/Settings/Link/output/Reserve....
Chez un gros client, la pile nécessaire est de 1GO !