Vider la pile

Tyozhebes Messages postés 5 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 21 février 2003 - 21 févr. 2003 à 11:47
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 - 22 févr. 2003 à 11:34
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2003 à 12:37
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...
0
Tyozhebes Messages postés 5 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 21 février 2003
21 févr. 2003 à 13:53
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!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 févr. 2003 à 14:22
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...
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
21 févr. 2003 à 17:32
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
22 févr. 2003 à 11:34
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 !
0
Rejoignez-nous