la création de nouveaux thread à l'aide de Qthread-Qt5
je suis en train de créer un nouveau thread gpsthread qui doit s'exécuter en arrière-plan, et de stocker la valeur.
class gpsthread: public QThread{
Q_OBJECT
private:nrega_status_t status2;
public:
explicit gpsthread(QObject *parent = 0):QThread(parent) {
//QTimer *t = new QTimer(this);
//connect(t, SIGNAL(timeout()), this, SLOT(processgps()));
//t->start(10000);
}
void run(){
qDebug()<<"inside gps thread\n";
QTimer *t = new QTimer(this);
connect(t, SIGNAL(timeout()), this, SLOT(processgps()));
t->start(10000);
}
public slots:void processgps(){
int status2;
status2=gps_management();
}
};
Ma classe principale est quickview.
int main(int argc, char *argv[])
{
QString file = "qml/main.qml";
QApplication app(argc, argv);
TranslationTest myObj;
QuickView view;
subthread object;
gpsthread obj;
gprsthread gprs;
view.rootContext()->setContextProperty("rootItem", (QObject *)&myObj);
obj.start();
//from subthread
QObject::connect(&object, SIGNAL(batterytoqml(QVariant,QVariant)),item, SLOT(frombattery(QVariant,QVariant)));
QObject::connect(&gprs, SIGNAL(gprstoqml(QVariant)),item, SLOT(fromgprs(QVariant)));
return app.exec();
}
j'ai essayé ce ainsi
class gpsthread: public QThread{
Q_OBJECT
private:nrega_status_t status2;
public:QTimer* t;
explicit gpsthread(QObject *parent = 0):QThread(parent) {
//QTimer *t = new QTimer(this);
//connect(t, SIGNAL(timeout()), this, SLOT(processgps()));
//t->start(10000);
}
void run(){
qDebug()<<"inside gps thread\n";
t = new QTimer(this);
connect(t, SIGNAL(timeout()), this, SLOT(processgps()));
t->start(10000);
exec();
}
public slots:void processgps(){
int status2;
status2=gps_management();
}
};
mais c'est de donner un message d'erreur indiquant que
QObject: Cannot create children for a parent that is in a different thread
si je créer un objet dans le constructeur, puis il va aussi donner le même message d'erreur parce que l'objet sera créé dans le thread principal.
Comment résoudre ce problème?
OriginalL'auteur geek | 2014-07-16
Vous devez vous connecter pour publier un commentaire.
Héritant de QThread n'est pas l'usage recommandé. QThread est une classe complète qui s'exécute une boucle d'événement, qui est généralement ce que vous avez besoin. Le la documentation recommande l'utilisation d'un travailleur de l'objet qui hérite de QObject et fonctionne dans un logement. Le travailleur est déplacé dans un QThread. Lors de la connexion d'un signal est envoyé, le logement sera exécuté dans le thread approprié.
Si vous voulez la minuterie à vivre dans l'autre thread,
QTimer::start
est un logement.N'êtes-vous pas manquant
timer->setSingleShot(true);
là?seul coup n'était pas dans la question, et je n'ai donc pas l'ajouter dans ma réponse. Étant donné le long délai d'attente, on peut raisonnablement supposer que le travailleur devrait
processgps
sur cet intervalle régulier.OriginalL'auteur 01d55
est parce
t = new QTimer(this)
dans lerun()
est la création d'un objet à l'enfant du fil, maisthis
qui point àgpsthread
est dans le thread principal. Une solution simple estt = new QTimer()
sans un parent et supprimer la minuterie dans le destructeur. Voici un exemple:Bientôt vous découvrirez la console d'impression:
qui signifie
processgps()
ne travaille pas dans votre enfant thread. C'est parce que cette machine à sous est un membre degpsthread
qui est dans le thread principal. Une solution simple est d'appelerprocessgps()
directement et d'utilisersleep()
comme minuterie:Ce n'est pas une solution sympa, recommandée est de la création d'un travailleur à faire tout le travail, puis utiliser QObject::moveToThread() comme dit dans QThread Document
OriginalL'auteur user3790229