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 :

Appeler un QThread dans une classe non-QObject ?


Sujet :

Multithreading

  1. #1
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut Appeler un QThread dans une classe non-QObject ?
    J'ai créé un QThread, mais j'ai un soucis pour l'appeler dans une classe A qui n'est pas un QObject,

    ne serait ce que parceque je ne peux rien passer en argument de Qthread(QObject*)

    Comment puis je faire ?

  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
    Citation Envoyé par ttone Voir le message
    J'ai créé un QThread, mais j'ai un soucis pour l'appeler dans une classe A qui n'est pas un QObject,

    ne serait ce que parceque je ne peux rien passer en argument de Qthread(QObject*)

    Comment puis je faire ?
    Peut être que le concurrent son plus adapté
    http://qt.developpez.com/doc/latest/...ntrun.html#run

    sinon, si tu peut expliquer un peu plus ce que va faire ta thread et ce que tu veut passer en paramètre

  3. #3
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Je veux lancer n traitements numériques en parallèles, j'ai donc exporté le traitement d'une méthode vers un QThread.

    Voilà en fait je développe à 4 mains,
    je récupère un code tel que :

    A:QMainWindow hérite de B
    B hérite de C

    B et C ne sont pas des Q_Object

    Je veux lancer un multithreading dans C.

    Ca a pas l'air gagné en QThread, puisque du coup il n'y a pas de parent référent.


    En résumé j'ai un coreAlgo en C, qui s'étoff en B et devient GUI en A.
    J'ai placé l'algorithme de fond dans un QThread X, que j'instancie n fois dans C, ou enfin je lance mes n thread->start()


    Peut être que le concurrent son plus adapté
    pas faux, il faut que j'étudie ca.

  4. #4
    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
    Citation Envoyé par ttone Voir le message
    Ca a pas l'air gagné en QThread, puisque du coup il n'y a pas de parent référent.
    est alors???

    Es ce que ces thread doivent s'exécuter en mêm temps en parallèle?

    si non :
    il te serait peut profitable que tu regarde Qtconcurent :
    http://qt.developpez.com/doc/latest/qtconcurrent.html
    genre map

    Ou peut être un pool de thread :
    http://qt.developpez.com/doc/latest/qthreadpool.html

  5. #5
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Es ce que ces thread doivent s'exécuter en mêm temps en parallèle?
    Oui c'est le but.

    Meme si je dois effectivement aller vers les docs que tu as linké, mon probleme est la classe instanciant les threads et / ou le pool de thread.

    Cette classe n'est pas QObject.

    Au niveau de l'argument si je lui met 0 j'ai un undefined symbol, si je lui met this, j'ai une erreur.

    Dans tous les cas meme si je passe par un pool je devrait l'instancier absolument dans cette classe.

  6. #6
    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
    Citation Envoyé par ttone Voir le message
    Oui c'est le but.
    Oublie les Qtconcurent alors.
    Ou est ton problème??? une QThread n'as pas besoin de parent pour être utilisée

  7. #7
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Mince c'st bien ce qu'il me semble...

    Pas besoin de Qobject *parent dans les arguments consctructeur alors ?
    C'est comme ca dans tous les tutos, et si je ne me trompe pas dans la doc aussi. Comme je disais plus haut la valeur 0 par défaut ne passe pas.

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QThread ( QObject * parent = 0 )
    http://qt.developpez.com/doc/latest/qthread.html

    pourquoi 0 ne passerais pas???

  9. #9
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    A priori j'ai un autre soucis, j'avais eu le meme probleme (/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: Undefined symbols:
    ) avec mon precedent QThread... pourtant j'ai vérifié tout ce qui provoque ce type d'erreur sur un constructeur.

    Peut être que ca vient de la déclaration en attribut de la classe appelant d'nu tableau de QThread :

    attribut :
    dans constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xthread = new X * [NBTHREAD];
    dans méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i; i<NBTHREAD; ++i)  xthread[i] = new X(0);

  10. #10
    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
    Citation Envoyé par ttone Voir le message
    A priori j'ai un autre soucis, j'avais eu le meme probleme (/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: Undefined symbols:
    )
    Qu'elle symbols n'est pas definie??

    Tu pourrai mettre une peu de code? comme le .h de ta thread?

    Sinon, un conseil, utilise une QList, pour stoker tes thread!!!

  11. #11
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Sinon, un conseil, utilise une QList, pour stoker tes thread!!!
    ok merci ! je vais tester cette option, on dirait que ca bugge en utilisant un tableau de thread.

  12. #12
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Voici un peu de code :

    .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public :
    FilterCore ** filterThread;
    .cpp / constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filterThread = new FilterCore * [NBRANGE];
    .cpp / méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	for(int i; i<NBRANGE; ++i){
    		filterThread[i] = new FilterCore(0, outfile[i], hBufferIndex, IR, savebands);
    	}
    //ERREUR ICI
    constructeur FilterCore :
    .h
    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
    using namespace std;
     
    class FilterCore : public QThread{
    	Q_OBJECT
     
     	public:
    	    FilterCore(QObject *parent = 0, SNDFILE * outfile, int hBufferindex=0, float * IR, bool savebands=false);
            ~FilterCore();
        	//initialisé dans "Association des Threads" dans Tache.cpp ligne 200
    		SNDFILE * outfile;
    		int hBufferSize;
    		float * IR;
    		bool savebands;
    		float * data;
     
    		//IDS, récupération par Tache en fin de traitement
    		static float ids [NBRANGE];			// tableau dans lequel on range les poids relatifs en dB // Question de l'initialisation
    		float L_ids [NBRANGE];
    		float R_ids [NBRANGE];
     
    		int readcount;
     
     
        private :
    	    void mono (int readcount);
    		void stereo (float data[], float LBuffer[], float RBuffer[], float IR[], int channels, int k, bool calcul, bool savebands);
    		float * Buffer;
     
    	protected:
    		void run();//thread	
    };
    .cpp
    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
    FilterCore::FilterCore(QObject * parent, SNDFILE * outfile, int hBufferindex, float * IR, bool savebands) : QThread(parent){
    	FilterCore::outfile  = outfile;
    	FilterCore::hBufferIndex  = hBufferIndex;				
    	FilterCore::savebands  = savebands;
    	FilterCore::IR  = IR;
     
    	for (i=0; i<NBRANGE; ++i) ids[k]=0;
    	hBufferSize=IR.size();
    	hBufferIndex=0;
    	Buffer=new float[hBufferSize];
    	for (i=0; i<hBufferSize;++i) Buffer[i]=0;
     
    	data = new float[BUFFER_LEN];
     
    	readcount=0;
    }
    erreur sur .ccp/methode :
    "FilterCore::FilterCore(QObject*, SNDFILE_tag*, int, float*, bool)", referenced from:
    Tache::convolution(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, bool, bool)in Tache.o
    ld: symbol(s) not found


  13. #13
    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
    Comment as tu créé ton makefile?
    La c'est un problème au link. Il doit manquer le .o de ta thread

  14. #14
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Ok, oubli de rajout au .pro .
    Donc forcément pas linké dans le Makefile.

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/01/2013, 10h00
  2. Réponses: 6
    Dernier message: 31/08/2006, 14h54
  3. [VB.Net] Appeler un cookie dans une classe
    Par zooffy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 23/06/2006, 23h47
  4. Appel de fonction dans une classe
    Par saint-pere dans le forum Langage
    Réponses: 3
    Dernier message: 08/05/2006, 22h13
  5. Appel de fonction dans une classe
    Par Seth77 dans le forum Langage
    Réponses: 8
    Dernier message: 16/01/2006, 10h32

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