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

Multithreading Discussion :

Morceau d'interface dans un thread ?


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut Morceau d'interface dans un thread ?
    Bonsoir,

    Je suis en train de réaliser une interface graphique pour un système de 2 caméras. Récément j'ai du rajouter du multitheading au programme afin que l'interface ne gèle pas pendant l'acquisition. A l'heure actuelle, mon programme se compose d'une thread principale mère contenant toute l'ihm (zones d'affichage des caméras incluses) et d'une ou deux threads fille (selon le nombre de caméra en fonctionnement) appelées lors du click sur le bouton start. Les thread filles consistent en une boucle (pseudo-infini) dans laquelle elles récupèrent la dernière image acquise et la transmete à leur zone d'affichage respective via un signal. Le programme marche trés bien pour chaque cméra séparemen mais quand les deux caméras fonctionne en même temps le programme plante?!! Je me dit que c'est peut être du à l'émission simultanée des deux signaux vers la thread mère (ie leur zone d'affichage).
    Du coup je pensais remédier à ce problème en créant les zones d'affichage dans une thread qui leur est propre mais je sais pas si c'ets possible... d'autant plus que je voudrais que les zones d'affichages restent dans la fenêtre principale.
    Merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut,
    Ce que tu fait me semble correcte.
    Que te dit le debuggeur?
    Peut tu mettre un peu de code?
    Qu'envoie tu pas le signal?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    le signal transmets une QImage, bien entendu j'ai utilisé qResgisterMetatype avant l'envoie, comme dans le tuto mandlebrot sur Qt .

    Sinon voila le code du run :
    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
    void getImage::run (){
    	status = 20072;
    	QImage image(resX, resY, QImage::Format_RGB16);
    	while (status == 20072){
    			SetCurrentCamera(handle);
    				//attente et acquisition de la dernière image
                                    erreur = WaitForAcquisitionByHandle(handle);
    				erreur = GetMostRecentImage(imData, resX*resY);
    				emit msg(erreur);
                                    //construction de la QImage point par point
    				if (erreur == 20002){
    					for (int i = 0 ; i<resX ; ++i ){
    						for (int j = 0; j<resY ; ++j){
    							image.setPixel(i, j, qRgb(imData[j*resX+i], imData[j*resX+i], imData[(j)*resX+i]));
    						}
    					}
    				}
    				emit hotImage (image);
    			SetCurrentCamera(handle);
    			GetStatus(&status);
    			}
     
    }
    et

    voici la partie qui reçoit et affiche l'image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void GLDisplay::newImage(QImage im){
    	display->setPixmap(QPixmap::fromImage(im));
    }
    les image font 658*496 pixels, 16 bit par pixels soit approximativement 5.2 mo par image (si je ne trompe pas), à 30 ips par caméra... Peut être la l'afflux de données est trop important?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Ce que tu as fait est bien.

    Ou créé tu les handel?

    Tu devrai optimizer cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (int i = 0 ; i<resX ; ++i )
    {
        for (int j = 0; j<resY ; ++j)
        {
            image.setPixel(i, j, qRgb(imData[j*resX+i], imData[j*resX+i], imData[(j)*resX+i]));
        }
    }
    1- il faut parcourire l'image ligne par ligne que colone par colone, ca fait moins de chargement/déchargement mémoire
    2-setpixel est très lent. Si possible, il faut mieux aller taper la mémoire directement. Tu est sur que t'as caméra fait du RGB16 tel que le défini Qt?
    http://qt.developpez.com/doc/4.6-sna...e/#format-enum

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    merci pour ta réponse

    merci aussi pour le conseil pour la construction de l'image, je corrige ca tout de suite.
    Sinon malheuresement ma caméra m'envoie des images 14bit.... et oui c'est pas le plus pratique . En fait si j'arrive à résoudre le problème de plantage, j'essaierai d'intégrer de l'openGl histoire de pouvoir manipuler plus facilement les images.
    Quand au problème de plantage, j'ai vraiment l'impression que la thread principale est débordée par l'afflux simultané (même si le traitement ne l'est pas)
    de données. Par exemple lorsque les caméra sont synchronisées, le programme plante après la première image afficher...

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    par contre tu n'as pas répondu. Ou créé tu les handel?

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/02/2008, 12h59
  2. Synchronize bloquant dans un thread
    Par bencot dans le forum Langage
    Réponses: 3
    Dernier message: 20/08/2004, 16h42
  3. [Process]Execution de process dans un thread
    Par devjava dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 18/06/2004, 10h34
  4. erreur d'un timer declaré dans un thread
    Par hak5 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/04/2004, 09h20
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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