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 ?
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
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()
pas faux, il faut que j'étudie ca.Peut être que le concurrent son plus adapté
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
Oui c'est le but.Es ce que ces thread doivent s'exécuter en mêm temps en parallèle?
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'argumentsi je lui met 0 j'ai un undefined symbol, si je lui met this, j'ai une erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part QObject *parent,
Dans tous les cas meme si je passe par un pool je devrait l'instancier absolument dans cette classe.
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.
http://qt.developpez.com/doc/latest/qthread.html
Code : Sélectionner tout - Visualiser dans une fenêtre à part QThread ( QObject * parent = 0 )
pourquoi 0 ne passerais pas???
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 X ** xthread;
dans méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part xthread = new X * [NBTHREAD];
Code : Sélectionner tout - Visualiser dans une fenêtre à part for(int i; i<NBTHREAD; ++i) xthread[i] = new X(0);
ok merci ! je vais tester cette option, on dirait que ca bugge en utilisant un tableau de thread.Sinon, un conseil, utilise une QList, pour stoker tes thread!!!
Voici un peu de code :
.h :
.cpp / constructeur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2public : FilterCore ** filterThread;
.cpp / méthode :
Code : Sélectionner tout - Visualiser dans une fenêtre à part filterThread = new FilterCore * [NBRANGE];
constructeur FilterCore :
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
.h.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
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 };erreur sur .ccp/methode :
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; }
"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
Comment as tu créé ton makefile?
La c'est un problème au link. Il doit manquer le .o de ta thread
Ok, oubli de rajout au .pro .
Donc forcément pas linké dans le Makefile.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager