IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

wxBitmap : IsOk retourne false


Sujet :

wxWidgets

  1. #1
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut wxBitmap : IsOk retourne false
    Bonjour à tous,
    Je me heurte actuellement à un drole de probleme. J'e dessine dans une wxBitmap par l'intermediaire d'un wxMemoryDC; le probleme intervient lors de la creation d'une wxBitmap. Je fais un truc tout bête:
    wxBitmap bitmap(800,800);
    Or, dans certains cas, bitmap.IsOk() retourne false juste apres la construction de l'objet (et il devient impossible de la manipuler). Des que cela arrive, il me dvient impossible, dans la suite du programme, de creer des wxBitmap: IsOk() retourne toujours false.
    J'ai vu que le IsOk() cherche en fait à determiner si le membre m_refData (hérité de wxObject) est nul ou non. Quelqu'un aurait-il une idée?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Hypothèse : tu as trop de handle ouvert et donc il n'y en a plus de disponible ?

  3. #3
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Hello,
    Je ne pense pas que ce soit ca, apres tests je peux creer plein de wxBitmap (bien plus que mes besoins en tout cas) sans probleme. Il y a juste une zone de mon programme ou cela ne marche pas. Les conditions de plantage sont assez particuliere: je lance ma fonction dans une fenetre, ca marche (je peux la lancer autant de fois que voulu, ca marchera toujours). Je lance ensuite cette fonction dans une deuxieme fenetre (meme classe que la premiere) et là ca crash. Code de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    vigra::UInt16Image ROIGenerator::GetROILabel(int width,int height)
    {   
    	wxBitmap m_bit(width,height);
    	bool ok1 = m_bit.IsOk();  // retourne false
     
    	{
                 wxMemoryDC dc(m_bit);
    	ComponentHandler::type_list & list = m_handler.GetList();
    	ComponentHandler::type_list::iterator it = list.begin();
    	int i = 2;
    	for(; it != list.end(); ++it, ++i)
    		static_cast<ShapeComponent*>( (*it).get() )->GetShape()->Draw(dc,i,width,height);
     
    	}
                 wxImage im = m_bit.ConvertToImage();
     
    	m_roi_labellisee = vigra::UInt16Image(width,height);
     
    	unsigned short val;
    	unsigned char g,b;
    	unsigned char *ptr = im.GetData();
    	for(int y=0; y<height; y++)
    		for(int x=0; x<width; x++)
    		{
    			int ind = (y*MAXWIDTH+x)*3;
    			g = ptr[ind + 1];
    			b = ptr[ind + 2];
    			//val = toNumber( wxColour(0,im.GetGreen(x,y),im.GetBlue(x,y)) );
    			val = toNumber( wxColour(0,g,b ));
    			if( val == 0 )
    				m_roi_labellisee(x,y) = 0;
    			else
    				m_roi_labellisee(x,y) = val;
    		}
     
    	return m_roi_labellisee;
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Une question : es-tu en multi-thread ?
    Autre piste : as-tu tracé les paramètres (width/height) pour voir s'ils sont valides ?

  5. #5
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Salut,
    Il n'y a pas de multithread lorque ca crash. Les parametres width et height sont valide au plantage (tracage avec le debuger de visual studio) et valent generalement 800 et 800 (peut etre que c'est trop justement). J'avais trouvé une astuce bidon pour contourner le probleme : je declarais m_bit comme variable membre de la class ROIGenerator et je faisais simplemement m_bit=wxBitmap(width,height) ce qui fonctionnait. Par contre, Le crash se deplacait à l'utilisation suivante d'une wxBitmap dans le programme.

    EDIT : apres tests, changer les dimensions de la bitmap ne donne aucun resultat

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Avec visual, tu peux entrer en mode debug dans le constructeur de wxBitmap. Est-ce CreateCompatibleBitmap qui retourne NULL ?

  7. #7
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Effectivement, c'est bien le CreateCompatibleBitmap qui retourne NULL. Heu, ca se soigne?

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    J'en sais rien. Fait un GetLastError dans ta fonction pour voir ?

  9. #9
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Arf, le GetLastError renvoit 0 dans tous les cas, ce qui va pas m'aider^^

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Est-ce que le HDC précédent est valide ?

  11. #11
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Est-ce que le HDC précédent est valide ?
    Je ne vois pas trop ce que tu veux dire par là. Dans tous les cas, en inspectant les fonctions appelées lors de la creation d'une wxBitmap, la seul et unique difference entre un cas qui marche et un qui foire est situé sur le bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ScreenHDC dc;
                hbmp = ::CreateCompatibleBitmap(dc, w, h);
    dans un cas hbmp est null et dans l'autre nom. J'ai trouvé le code de la fonction CreateCompatibleBitmap, peut etre que je pourrait la remplacer pour voir ce qu'il s'y passe

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Essayons du brutal : mets le code suivant pour ta création de bitmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    HDC m_hdc;
    m_hdc = ::GetDC(NULL);
    DWORD dwErreur(0);
    if(!m_hdc)
    {
       dwErreur = GetLastError();
       // ???
    }
    else{
       HBITMAP hbmp;
       hbmp = ::CreateCompatibleBitmap(m_hdc, 800, 800);
       if ( !hbmp )
       {
          dwErreur = GetLastError();
          // ???
       }
       else{
            DeleteObject (hbmp );
       }
       DeleteDC (m_hdc);
    }

  13. #13
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Hello,
    J'ai copier ce code au debut de ma fonction GetROILabel : CreateCompatibleBitmap retourne NULL et GetLastError retourne toujours 0. C'est à n'y rien comprendre

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En revanche, le ::GetDC(NULL) te retourne un handle valide ?

    [EDIT] : j'ai ouvert une discussion côté windows pour voir quelles peuvent être les raisons de cet échec (qui est très spécifique à windows et indépendant de wxWidget en fait). La discussion est ici.

  15. #15
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Vivi, le ::GetDC(NULL) retourne bien un handler valide. Le beau message que me renvoie Visual dans la fenetre output : "'CreateCompatibleBitmap' failed with error 0x00000000 (opération réussie.).". C'est pas magnifique ca?. En tout cas, merci bien pour ton aide et pour avoir ouvert un nouveau post sur le sujet, ca va peut etre debloquer la situation

  16. #16
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pense à répondre dans ce nouveau fil, car je n'ai pas les éléments que tu as (expl : quel est l'os sur lequel tu bosses ?)

  17. #17
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Bon, il semble en fait que ta premiere intuition soit la bonne : trop de handle ouvert. En fait les wxRegion stock des wxBitmap en interne, et j'en utilisais autour de 4000... J'ai remplacé mes wxRegion par des wxRect (pour ce que j'en fait ca change rien) et hop, de retour à la normale. Problème résolu en tout cas, merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] mysqli_query retourne FALSE
    Par scorzen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/02/2009, 11h04
  2. Réponses: 4
    Dernier message: 17/09/2008, 13h05
  3. Requete mysql effectuée mais qui retourne false?
    Par lysandre dans le forum Requêtes
    Réponses: 8
    Dernier message: 24/03/2008, 16h55
  4. [php 5.1.2][bug?]get_cfg_var retourne false
    Par jeff_! dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2006, 13h33
  5. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo