Plantage avec API

Résolu
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 - 14 déc. 2012 à 14:41
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 19 déc. 2012 à 21:04
Bonjour,

Je travaille avec VB6 sous Windows7 et je suis confronté au problème suivant :
J'utilise les API : CreatePolygonRgn, CombineRgn, FillRgn, OffsetRgn, PtInRegion, Polygon, CreateSolidBrush
Après plusieurs déplacements et rotations de polygones l'application plante.
Les contrôles sont entourés d'un épais filet noir et je ne peux plus fermer l'appli. Obligé de passer par le gestionnaire de tâches.
Je précise que lorsque je sélectionne avec SelectObject un Brush je n'oublie pas d'utiliser DeleteObject avant d'en utiliser un autre.
La Picture est en mode AutoRedraw et j'utilise Refresh suivie d'un DoEvents.

Avez-vous déjà été confronté à ce problème ? Si oui quelle est la solution, merci.

Cheyenne

17 réponses

cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
19 déc. 2012 à 16:38
Re,

Je pense avoir identifié le problème.
J'ai un tableau de 7 régions, et lorsque je déplace un polygone je sauvegarde sa région dans le tableau, sans effacer l'ancienne région.
region(n) = CreatePolygonRgn(poly(1), npts(n), WINDING)
En effaçant par Call DeleteObject(region(n)) avant de créer la nouvelle région, ça ne plante plus, du moins pour l'instant ! A vérifier...

Je vais voir avec OffsetRgn au lieu d'effacer et de créer une région.

Cheyenne
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 déc. 2012 à 15:56
Bonjour, Cheyenne,
tu nous parles bien de ce que tu fais pour zigouiller ce que tu crées avec selectobject (que tu ne mentionnes d'ailleurs pas dans la liste des fonctions de l'api de windows utilisées)
1) et quid des autres créations ?
2) tu n'utiliserais pas, en plus, d'autres fonctions de l'Api de Windows (et si oui : lesquelles) ?
Le mieux est que tu fasses un petit exemple "plantant" et nous montres le code complet écrit.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
14 déc. 2012 à 16:23
Bonjour ucfoutu,

Oui, effectivement je n'ai pas mentionné toutes les API. Il manquait entre autres SelectObject et DeleteObject. J'utilise également ExtFloodFill, mais celle-ci ne pose aucun problème tout comme BitBlt (je travaille avec un double buffer).

J'ai indiqué seulement les API suspectes.
Quant à fournir un code "plantant", cela m'est très difficile, car parfois cela plante au lancement de l'appli ou seulement après une dizaine de déplacement de polygones, voire plus, c'est variable.

Le code fait actuellement plus de 1000 lignes. C'est un jeu de Tangram et c'est le déplacement des pièces, à l'aide du pavé directionnel, qui fait planter au bout d'un moment. Le déplacement à la souris de la pièce ne pose pas, lui, de problème tout comme les rotations.

J'ai essayé avec le même résultat de lancer VB6 en mode de compatibilité Windows98.

Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
14 déc. 2012 à 16:54
c'est le déplacement des pièces, à l'aide du pavé directionnel, qui fait planter au bout d'un moment. Le déplacement à la souris de la pièce ne pose pas, lui, de problème tout comme les rotations.

Je vois assez mal comment ce déplacement à l'aide du pavé directionnel pourrait faire planter ce que le déplacement à la souris ne fait pas planter.
Montre à tout hasard les subs et déclarations de variables correspondant )à ce seul code.
Précise (important) s'il s'agit de pictureboxes "normales" ou "retravaillées" pour leur donner un contour non rectangulaire.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0

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

Posez votre question
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
14 déc. 2012 à 17:33
Re,

Ce sont des PictureBox standard.
Je vois assez mal comment ce déplacement à l'aide du pavé directionnel pourrait faire planter ce que le déplacement à la souris ne fait pas planter.
Et pourtant...

A chaque changement de figure à reconstituer, je stocke dans une Picture (picFIGURE) la silhouette de la figure en gris clair. Silhouette créée avec CombineRgn.
Au départ je copie cette silhouette dans un buffer (picBUFFER) et dispose les pièces sur les bords puis copie l'ensemble sur picJEU.

A chaque déplacement je copie picFIGURE sur picBUFFER et dispose les pièces à leur nouvelle position, puis picBUFFER -> picJEU.
C'est cela qui pose problème au bout d'un moment.

Je vais faire l'essai de dessiner chaque pièce dans un autre buffer(picPOLY) et faire un TransparentBlt sur picBUFFER pour chacune des 7 pièces.

Je rends compte du résultat dès que...

Cheyenne
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
16 déc. 2012 à 12:47
du peut que j'ai appris sur les API, le plus souvent les plantages grave, sont du à des écriture ou lecture en mémoire au mauvais endroit, vérifie le plus possible tes valeurs avant le plantage (je sais que c'est pas facile, car cela plante pas tout le temps)
pour t'aider met en boucle (x1000) avant chaque procédure api suspect pour savoir q quel endroit cela plante
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 déc. 2012 à 13:58
J'aimerais tellement que l'on cessât d'utiliser le terme "API" au lieu de "une fonction de l'Api de Windows", en disant laquelle.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
16 déc. 2012 à 14:11
Re,

Après essai avec la deuxième méthode le résultat s'avère le même.
Je suis revenu à la première et réduit la Form de façon à voir le message d'alerte qui jusqu'à présent se cachait derrière la Form.
Message : Mémoire insuffisante.
Puis : Unhandled exception in VB6.EXE 0xC00000FD : Stack Overflow

Je ne vois pas d'où cela provient car je n'ai pas d'appels récursifs.
J'ai créé au départ des Brush dont :
brush_BLEU = CreateSolidBrush(&HC0C000)
brush_VERT = CreateSolidBrush(vbGreen)
Je les sélectionne selon les besoins par,
Call SelectObject(picBUFFER.hdc, brush_VERT)
mais je ne la supprime pas. J'ai essayé aussi de la créer à chaque fois et de la supprimer, mais c'est pareil, ça plante toujours !

Cheyenne
0
rebixav Messages postés 130 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 28 janvier 2013
19 déc. 2012 à 07:48
le dépassement de pile peut aussi avoir un rapport avec des procédure qui tourne au rond dans une boucle quasi sans fin !
Mais normalement c'est l'une de tes fonctions api qui produit cela, d'utilise bien le pas à pas de VB6 pour savoir ou cela fige ?! Et avec Quel Function api cela plante, maintenant tu doit le savoir ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2012 à 08:11
Il est tout simplement impossible d'en déterminer la cause sans voir la totalité du code de cette appli.
Tout ce que l'on peut dire dans l'état de la connaissance que l'on a de ton appli, est qu'il ne serait pas surprenant que ta pile soit débordée en raison d'un trop grand nombre d'appels récursifs. Si c'était bien là la cause réelle, ce serait alors carrément la conception elle-même, qu'il te faudrait reconsidérer.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 déc. 2012 à 09:00
Salut

Après plusieurs déplacements et rotations de polygones l'application plante.


peut etre effectue seulement des déplacements
pour voir si le bug se reproduit

ensuite seulement des rotations
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
19 déc. 2012 à 14:53
Bonjour,

@ ucfoutu, je n'ai pas d'appels récursifs.
Pour tester j'ai remplacé les Brush par des FillColor, c'est pareil. Au moins je sais que ce n'est pas la fonction SelectObject qui est en cause.

@ Shayw : j'ai déjà testé cela, aux environs de 1500 déplacements, ça plante.
Quand au calcul des rotations, je m'en suis affranchi ! J'ai pré-calculé les positions des coins dans un tableau à partir du centre de chaque pièce, cela évite les diverses rotations lorsque l'on inverse les pièces, notamment avec le parallélogramme. Le polygone est redessiné à partir de ce tableau, c'est ultra rapide.

Si je laisse une pièce à sa place et la fait seulement pivoter, c'est pareil au bout d'environ 1500 rotations, ça plante.
Chaque pièce est une 'région' et lors du plantage la 'région' n'est plus reconnue.
region(n) = CreatePolygonRgn(poly(1), npts(n), WINDING)
Je suis obligé d'avoir une région par pièce afin d'identifier laquelle déplacer.
Dans l'évènement MouseDown j'ai mis :
For i = 1 To 7
If PtInRegion(region(i), x, y) <> 0 Then
etc...
Quand je clique sur une pièce, celle-ci passe en vert et la pièce validée précédement reprend sa couleur d'origine.

@ rebixav : je pense que c'est la fonction Polygon qui plante !

Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2012 à 16:59
Un petit rappel d'une question que je t'avais posé dès le départ :
tu nous parles bien de ce que tu fais pour zigouiller ce que tu crées avec selectobject (que tu ne mentionnes d'ailleurs pas dans la liste des fonctions de l'api de windows utilisées)
1) et quid des autres créations ?


J'espère que tu n'en as pas d'autres encore, de créations non zigouillées...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
19 déc. 2012 à 18:24
Bonsoir ucfoutu,

Non, rassures-toi, je "zigouille" chaque objet créé après son utilisation. Pour l'instant tout à l'air de bien fonctionner.

Par contre c'est au niveau des Brush que je me pose la question, elles sont crées en début de programme, entre autres :
brush_BLEU = CreateSolidBrush(vbBlue)
brush_VERT = CreateSolidBrush(vbGreen)
et j'appelle celle qui me convient selon les besoins mais je ne la supprime pas. Dois-je par sécurité la créer à chaque fois et la supprimer dès que ? Ou alors utiliser FillColor...

J'ai pris bonne note en ce qui concerne l'API.
Oui, j'aurais dû écrire en titre :
Plantage avec certaines fonctions de l'API de Windows.
Puis dans un post : Oui, effectivement je n'ai pas mentionné toutes les API à remplacer par
...je n'ai pas mentionné toutes les fonctions de l'API.

Alors, heureux, maintenant ?

Bonne soirée,

Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2012 à 19:11
je "zigouille" chaque objet créé après son utilisation

Bon. Mais ce n'est que maintenant, que tu viens de zigouiller la région créée ( ton deleteObject(region(n)))
Il n'est pas utile de zigouiller tes 2 Brushes s'il ne sont créés (et non modifiés ensuite) qu'une seule fois en tout début de ton appli.
Ne les zigouille donc qu'en fermant (sauf si créés dans le code d'un Form, au chargement ou activate ou initialize, etc...et dans ce cas : à zigouiller au déchargement du Form)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
19 déc. 2012 à 20:27
Re,

Bon. Mais ce n'est que maintenant, que tu viens de zigouiller la région créée...

Ben oui, car je pensais que l'on pouvait remplacer une région par une autre sans que cela pose des problèmes !
Ok, pour les Brush, j'en ai en fait 5 qui sont toutes créées en début de programme et je les utilise en les sélectionnant mais je ne les modifie jamais. Elles sont virées au déchargement de la feuille tout comme les régions.

Ouf, je respire. Il ne me reste plus qu'à gérer le chevauchement des régions et là j'ai un petit hic. En effet, les régions sont cernées par un filet noir de 1 pixel et avec la fonction PtInRegion je détecte si un des coins d'une pièce pénètre une autre pièce. Le hic c'est que cela me fait un filet de 2 pixels quand les pièces se juxtaposent.
Je suppose que tu vas me dire d'ouvrir un autre post afin d'avoir de l'aide !

Cheyenne
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2012 à 21:04
Je suppose que tu vas me dire d'ouvrir un autre post afin d'avoir de l'aide !

D'après toi ? Devine ...
Si cette discussion peut maintenant être libérée, pour le problème qu'elle traite, libère-la donc.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous