CORRECTIF : L’impression depuis Java entraîne l’épuisement des ressources GDI et système

SYMPTÔMES

Si vous utilisez PrintJob (via getToolkit () .getPrintJob) pour l’impression plusieurs fois par le biais de Java, cela entraîne l’épuisement du périphérique d’affichage

Ressources de l’interface (GDI). Si l’application qui effectue l’impression est hébergée dans un navigateur, il finiront par entraîner le navigateur cesse de répondre.

CAUSE

Le contexte de périphérique n’est pas supprimé dans Graphics.dispose().

Résolution

Pour résoudre ce problème, mettez à jour votre version de la machine virtuelle de Microsoft (Microsoft VM) pour générer des 3188 (ou version ultérieure). Reportez-vous à la section « Références » de cet

article pour un lien pour télécharger la dernière version de Microsoft VM.

ÉTAT

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés au début de cet article.

Ce problème a été corrigé dans Microsoft VM build 3188 et versions ultérieur.

Ce problème a été corrigé dans Windows 2000 Service Pack 1.

Plus d'informations

Procédure pour reproduire le comportement

Vous pouvez suivre cette procédure pour reproduire le problème :
  1. Sur un ordinateur fonctionnant sous Windows 98 avec Microsoft VM version 3186 ou antérieure, créez un fichier GDILeakTest.java par le code suivant :
    import java.awt.*;import java.awt.event.*;public class GDILeakTest extends Frame {    PrintCanvas canvas;    public GDILeakTest() {        super("GDI leak Test");        canvas = new PrintCanvas();        add("Center", canvas);        Button b = new Button("Print");        b.setActionCommand("print");b.addActionListener( new ActionListener(){public void actionPerformed(ActionEvent e){buttonActionHandler(e);}});        this.add("South", b);this.addWindowListener( new WindowAdapter(){public void windowClosing(WindowEvent e){close();}});        this.pack();    }    public void close()    {System.exit(0);    }    private void buttonActionHandler(ActionEvent e){String cmd = e.getActionCommand();if (cmd.equals("print")) {    PrintJob pjob = getToolkit().getPrintJob(this,"GDI Leak Test", null);    if (pjob != null) {Graphics pg = pjob.getGraphics();if (pg != null) {   canvas.printAll(pg);   pg.dispose();}pjob.end();    }}    }    public static void main(String args[]) {        GDILeakTest test = new GDILeakTest();        test.show();    }}class PrintCanvas extends Canvas {    public Dimension getPreferredSize() {        return new Dimension(400, 200);    }    public void paint(Graphics g) {        Font font = new Font("Courier", Font.BOLD, 11);        g.setFont(font);        g.setColor(Color.black);        g.drawString("This is a test page", 10, 50);        g.drawString("Print this page number of times", 10, 70);        g.drawString("Watch the resource meter", 10, 90);    }}
  2. Utilisez la commande suivante pour compiler GDILeakTest.java :
    JVC GDILeakTest.java
  3. Exécutez la généré à l’aide de GDILeakTest.class :

    Jview GDILeakTest.class
    Cela entraînera une boîte de dialogue cadre s’affiche avec un bouton Imprimer .
  4. Ouvrez l’outil Vumètre ressources dans Windows 98 (dans le menu Démarrer , pointez sur programmes, sur Accessoires, pointez sur le système

    Outils, puis cliquez sur Vumètre ressources). Cliquez sur le bouton Imprimer pour imprimer une page de test, et chaque impression affiche une baisse dans le GDI et système

    ressources. Après un nombre de tirages répétés, seront épuise les ressources GDI et le système va cesser de répondre ou s’arrêter.

RÉFÉRENCES

La dernière version de Microsoft VM est disponible au téléchargement sur le site Web suivant :

Pour plus d’informations sur le dernier service pack pour Windows 2000, cliquez sur le numéro ci-dessous
Pour afficher l’article correspondant dans la Base de connaissances Microsoft :

Pour des informations sur Visual J ++ et SDK pour Java, visitez le site Web de Microsoft à l’adresse suivante :

Propriétés

ID d'article : 244201 - Dernière mise à jour : 15 févr. 2017 - Révision : 1

Commentaires