EDIT: strong> J'ai essayé de faire ce que vous m'avez dit dans des commentaires ...: p> Ceci produit encore plus d'erreurs: P> Citizen * c = new Citizen(this);
c->start();
6 Réponses :
Je ne crois pas que le nouveau fil existe jusqu'à ce que la course soit appelée. Donc, le constructeur est un fil différent que celui exécutif (). Que se passe-t-il si vous déplacez la création de l'objet Manager du constructeur pour exécuter ()? J'imagine que cela corrigera la première erreur, sinon l'erreur de minuterie aussi. p>
En outre, je pense que beaucoup de gens construisent toujours des threads comme vous l'êtes, mais vous voudrez peut-être vérifier ceci . p>
Ne fonctionne pas, j'ai également vérifié ce message de blog. Vérifiez ma question.
Qui n'a pas fonctionné? Déplacement de la création d'un gestionnaire hors du constructeur ou d'utiliser Movetothread dans la manière dont le lien traite? Je ne pense pas que votre édition est correcte. Si vous utilisez le citoyen comme objet qui est déplacé vers un QThread, le citoyen ne devrait pas dériver de QThread.
Tout d'abord, votre QThread, créé sur une pile, détruit après avoir quitté le sous-programme, qui commence le fil. Tu ne veux pas ça, je suppose. Vous devriez faire un membre de QThread d'une classe. Ensuite, vous n'avez pas besoin d'appeler explicitement Quitter code> méthode. Votre thread s'arrête lorsque
EXEC code> retour.
@Brett Stetlemyer Déplacement de la création de gestionnaire du constructeur n'a pas fonctionné. MOPETOTOTHRead non plus, mais comme vous l'avez souligné, je pourrais l'utiliser de manière incorrecte. Je vais essayer de votre chemin.
@Brett j'ai fait le citoyen Class A QOBJECT, mais cela ne fonctionne toujours pas.
@ Lol4t0 Je ne comprends pas comment faire de QThread un membre d'une classe?
Tout code, qui crée un thread est une fonction de certains cours, n'est-ce pas? Lorsque ce retour, le thread créé sera détruit, car votre thread est la variable locale i>. Vous devez déplacer votre définition de thread de cette fonction
Vous devez considérer Affinité du fil . Ce message d'erreur n'est pas couché ou insensé, il vous dit exactement em> ce qui ne va pas. P>
Votre lien est mort.
Vos problèmes sont principalement dus à essayer de sous-classe QTthread. Même si la documentation le recommande, ce n'est pas le meilleur moyen d'utiliser QThread. S'il vous plaît voir Cette question et réponse Pour plus d'informations et de liens. p>
Je n'ai pas compris l'erreur StarTimers, bien qu'elle puisse être liée au premier. Dans tous les cas, vous devriez être capable de corriger la première erreur. J'ai rencontré ce problème à quelques reprises à quelques reprises et je trouve que cela soit le "meilleur" moyen de contourner, c'est créer une fonction d'initialisation et une fonction de nettoyage. Tous les membres de la classe sont des pointeurs initialisés à NULL jusqu'à ce que la course soit appelée. Notez que "Best" est dans des citations car il y a certainement des opinions différentes, mais cela fonctionne pour la plupart des situations pour moi.
en-tête EM> p> Citizen::Citizen(QObject * parent) :
manager(NULL) {
}
void Citizen::onReplyFinished(QNetworkReply* net_reply) {
emit onFinished(net_reply);
}
void Citizen::run() {
initialize();
manager->get(QNetworkRequest(QUrl("http://google.com"));
QEventLoop eLoop;
connect(manager, SIGNAL( finished( QNetworkReply * ) ),
&eLoop, SLOT(quit()));
eLoop.exec(QEventLoop::ExcludeUserInputEvents);
qDebug() << "loaded google!";
exec();
cleanUp();
}
void Citizen::initialize() {
manager = new QNetworkAccessManager;
connect(_net_acc_mgr, SIGNAL(finished(QNetworkReply*)),
this, SLOT(onReplyFinished(QNetworkReply*)));
}
void Citizen::cleanUp() {
delete manager;
disconnect(_net_acc_mgr, SIGNAL(finished(QNetworkReply*)),
this, SLOT(onReplyFinished(QNetworkReply*)));
}
Je vais juste essayer de répondre à la raison pour laquelle vous voyez Si vous le faites P> class myClass
{
virtual ~myClass ();
QThread mythread;
};
myClass::~myClass
{
mythread.stop ();
}
void myClass::mtMethod () {
Citizen * c = new Citizen(this);
c->moveToThread(&mythread);
connect(&mythread, SIGNAL(started()), c, SLOT(ProcessActions()));
mythread.start();
}
Affectation d'un parent à un objet qui est ensuite déplacé vers un autre thread est un non go. Cette réponse est incorrecte. La réponse de Bowles Sørhus @Kim Bowles est celle qui devrait être marquée comme telle.
QThread *thread = new QThread; thread->start(); Citizen *worker = new Citizen; worker->moveToThread(thread); //startWorking can be equivalent of the run function //in your current implementation and this is where you should //create the QNetworkAccessManager QMetaObject::invokeMethod(worker,"startWorking");
Il existe un bon article pour ce sujet threads, événements et qObjects . Si votre citoyen de classe fonctionne dans un fil, vous ne devez pas le hériter de QThread, car le but de l'héritage de QThread n'est pas de faire du travail dans le fil, mais gérer le fil.