Plantage avec API [Résolu]

Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
- 14 déc. 2012 à 14:41 - Dernière réponse :
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
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
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
19 déc. 2012 à 16:38
3
Merci
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

Merci cs_cheyenne 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_cheyenne
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
14 déc. 2012 à 15:56
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
14 déc. 2012 à 16:23
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
14 déc. 2012 à 16:54
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
14 déc. 2012 à 17:33
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
28 janvier 2013
16 déc. 2012 à 12:47
0
Merci
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
Commenter la réponse de rebixav
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
16 déc. 2012 à 13:58
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
16 déc. 2012 à 14:11
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
130
Date d'inscription
dimanche 16 décembre 2007
Dernière intervention
28 janvier 2013
19 déc. 2012 à 07:48
0
Merci
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 ?
Commenter la réponse de rebixav
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
19 déc. 2012 à 08:11
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
3238
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
14 mars 2018
19 déc. 2012 à 09:00
0
Merci
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
Commenter la réponse de cs_ShayW
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
19 déc. 2012 à 14:53
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
19 déc. 2012 à 16:59
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
19 déc. 2012 à 18:24
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
19 déc. 2012 à 19:11
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
693
Date d'inscription
samedi 18 mai 2002
Dernière intervention
17 avril 2017
19 déc. 2012 à 20:27
0
Merci
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
Commenter la réponse de cs_cheyenne
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
19 déc. 2012 à 21:04
0
Merci
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.
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.