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

Qt Discussion :

QObject::killTimers, dessiner sur une QImage dans un thread


Sujet :

Qt

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 10
    Points
    10
    Par défaut QObject::killTimers, dessiner sur une QImage dans un thread
    Bonjour,

    Je réalise un programme et je dois générer un des images (QImage) dans un thread à partir d'un fichier XML. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <book>
    	<chapter>
    		<page>
    			<text>bla bla</text>
    			<image path="illustration_intro.jpg" />
    		</page>
    	</chapter>
    </book>
    J'ai donc un code qui ressemble +- à ceci :

    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
    void PageCreator::run()
    {
        QImage *image = new QImage(Page::width, Page::height, QImage::Format_RGB32);
        QPainter painter(image);
     
        QPen pen(Qt::white);
        painter.setPen(pen);
     
        QFont font("Verdana", 15, QFont::Bold);
        painter.setFont(font);
     
        QDomNode node = pageNode.firstChild();
        while(!node.isNull())
        {
            if(node.toElement().tagName() == "text")
            {
               QString test = "boum";
               painter.drawText(10, 10, test);
            }
            else if(node.toElement().tagName() == "image")
            {
               QString path = node.toElement().attribute("path");
               painter.drawImage(0, 0, QImage(path));
     
            }
            node = node.nextSibling();
        }
     
        this->page = new Page(this->num, image);
    }
    Avec le dessin de l'image je n'ai aucun problème, par contre lorsqu'il rencontre de drawText(), là mon application se coupe et j'ai le message :

    ASSERT: "qApp && qApp->thread() == QThread::currentThread()" in file kernel\qapp
    lication_win.cpp, line 902

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    QObject::killTimers: timers cannot be stopped from another thread
    Je n'ai trouvé de la documentation sur killTimers() uniquement pour Qt 3.3 (ici) alors que j'utilise Qt 4.5 et apparemment la méthode n'est plus disponible. Pour ceux que ça peut intéresser, voici le bout de code dans "gui\kernel\qapplication_win.cpp":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Q_GUI_EXPORT HDC qt_win_display_dc()                        // get display DC
    {
        Q_ASSERT(qApp && qApp->thread() == QThread::currentThread());
        if (!displayDC)
            displayDC = GetDC(0);
        return displayDC;
    }
    Si je commente le drawText(), tout se passe parfaitement. Le drawPoint() ou drawRect() ne pose pas de problème non plus.

    Merci de votre aide,
    Sébastien

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut.
    Tu compile sur quel os et avec quel version de Qt??


    Ton crash, n'st pas un crash, c'est leassert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Q_ASSERT(qApp && qApp->thread() == QThread::currentThread());
    en gros, tu essaie d'utiliser quelque une ressource réservé à la thread principale

    regarde ceci
    http://qt.developpez.com/doc/4.5/thr...ing-in-threads

Discussions similaires

  1. Dessin sur un canvas dans une DLL
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2009, 14h09
  2. Réponses: 6
    Dernier message: 18/09/2008, 12h35
  3. Comment écrire sur une image, dans un cadre ?
    Par Nutrino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/05/2005, 00h55
  4. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11
  5. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25

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