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

Windows Discussion :

Fenetres et ressources partagées


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Fenetres et ressources partagées
    Bonjour,

    Voila, dans mon appli, je peux ouvrir plusieurs fenetres.

    Toutes ces fenetres sont des instances d'une même classe, et l'utilisateur peut en ouvrir un nombre indeterminé (autant qu'il le souhaite, ou presque)

    Donc, pour economiser la mémoire, j'ai créé une classe "skin" qui contient toutes les images, polices de caractères, etc pour une fenetre.

    Et j'ai déclaré une instance statique de cette classe, qui est utilisée par toutes les fenetres.

    Or, après quelques bugs et un peu d'investigation, je vient de comprendre d'une meme bitmap (par exemple) ne peut etre selectionnée dnas plus d'un DC à la fois.

    Or, il arrive que deux fenetres essaient de se dessiner en même temps avec la même bitmap... donc erreur !


    1/ vu que j'ai environ 3 Mo de données (graphique...) par fenetre, qu'il est prevu dans une uitilisation "normale" d'ouvrir 4-5 fenetres à la fois, est-ce que ça vaut vraiment le coup de partager les ressources pour economiser 12 Mo ?

    2/ comment faire pour partager proprement les ressources ? Y-a-t-il un autre moyen que de proteger les "SelectObject" par des Mutex ou autre ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Tu peux toujours partager les DC Mémoire contenant les bitmaps. C'est ce que je conseillerais de faire: Des DC ayant la même durée de vie que les bitmaps eux-mêmes...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Euh, je ne suis pas tres sûr de bien comprendre...

    Actuellement, j'utilise un seul DC (hdcSource) comme source de tous mes BitBlt, quand je veux dessiner une bitmap, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SelectObject(hdcSource, hBitmap);
    BitBlt(hdcBackBuffer, hdcSource);
    1/ Tu veux dire que je devrais créer un hdcSource par Bitmap ?
    2/ Ou que je devrais utiliser le même hdcSource pour toutes mes fenetres ?

    Parceque, pour 1 il me semble que ça fait beaucoup de DC à créer, non ?
    Pour 2, le probleme est le même puisque la fenetre 1 peut selectionner une bitmap pour la dessiner et pendant ce temps la fenetre 2 en selectionne une autre...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Je pense que oui, 1.
    De toute façon, ce qui prend le plus de place dans un MemoryDC, c'est le bitmap...
    N'oublie pas de garder sous la main, pour chaque DC, le handle du bitmap d'origine, car il faut le restaurer avant de détruire le DC. Mais ce bitmap n'est pas encombrant non plus, c'est toujours un bitmap 1x1 monochrome...

    PS: Tu ne devrais pas avoir de problème de "fenêtre qui dessine en même temps qu'une autre" si tes fenêtres sont toutes sur le même thread...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ok, donc je vais créer un memoryDC pour chaque bitmap qui est chargée.

    PS: Tu ne devrais pas avoir de problème de "fenêtre qui dessine en même temps qu'une autre" si tes fenêtres sont toutes sur le même thread...
    J'avoue que je ne me suis pas trop posé la question...

    Voici comment ça marche :

    Dans mon appli, je fait un CreateWindowEx pour créer la fenetre principale.

    Dans la boucle de messages de cette fenetre, je crée les fenetres "secondaires" avec aussi un CreateWindowEx.

    A aucun moment je ne lance de thread separés.. je suppose danc que toutes mes fenetres sont dans le même thread, non ?

    Si c'est le cas, pourquoi j'ai des soucis de partage des ressources ?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Pour commencer, j'ai du mal à comprendre comment tu peux te rendre compte qu'un bitmap ne peut être sélectionné dans plusieurs DCs si tu n'en utilises qu'un seul.

    Ensuite, si tu en utilises en vérité un par fenêtre, vérifie que le bitmap n'y est associé que pendant le dessin. Les fenêtres ne dessineront pas en même temps, mais si une association persiste hors du dessin, problème...

    Et surtout, fais gaffe si tu utilises des MessageBox() : Elles ont le défaut de contenir une boucle de messages, qui peut permettre des trucs à des moments où ils ne sont pas censés arriver.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Architecture et ressources partagées
    Par Invité dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/01/2009, 14h44
  2. Threads et ressource partagée !
    Par myryad dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 19/06/2008, 13h28
  3. Ressources partagées entre projets
    Par fterf dans le forum C#
    Réponses: 3
    Dernier message: 03/01/2008, 11h32
  4. Réponses: 2
    Dernier message: 22/12/2006, 10h38
  5. [Réseau][ressource partagée]Autentification
    Par heid dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 12/11/2003, 16h00

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