QT threads :Arriver QObject::startTimer: minuteries ne peut pas être démarré à partir d'un autre thread d'avertissement
J'ai suivi les exemples de l'intervalle Qt SDK, à partir de la minuterie dans le QThread
sous-classe
mais je continue de recevoir l'avertissement et le fil ne démarre la minuterie.
Voici le code:
NotificationThread::NotificationThread(QObject *parent)
:QThread(parent),
m_timerInterval(0)
{
moveToThread(this);
}
NotificationThread::~NotificationThread()
{
;
}
void NotificationThread::fire()
{
WRITELOG("A::fire called -- currentThread:" + QString::number((int)currentThread()->currentThreadId()));
QVector<StringPer>* batchVectorResult = new QVector<StringPer>();
emit UpdateGroupNotifications(batchVectorResult);
}
void NotificationThread::run()
{
connect(&m_NotificationTimer, SIGNAL(timeout()),
this,SLOT(fire(),Qt::DirectConnection));
WRITELOG("A::run() worker thread -- currentThread:" + QString::number((int)currentThread()->currentThreadId()));
//SetNotificationTimerFromConf();
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD));
int interval = val.toInt();
m_NotificationTimer.setInterval(interval);
m_NotificationTimer.start();
QThread::exec();
}
void NotificationThread::SetNotificationTimerFromConf()
{
QVariant val(ConfigSettings::getInstance()->ReadFromSettingsReturnVariant(SETTINGS_KEY_NOTIFICATIONTHREAD));
int interval = val.toInt();
m_NotificationTimer.setInterval(interval);
}
void NotificationThread::UpdateNotificationTimerRT(int timerInterval)
{
m_NotificationTimer.setInterval(m_timerInterval);
}
void NotificationThread::Execute(const QStringList batchReqList)
{
QVector<QString>* batchVectorResult = new QVector<QString>();
start();
}
Je démarre le Thread de l'interface graphique principale avec Execute( )
.
Vous devez vous connecter pour publier un commentaire.
Si vous ajoutez la ligne
au début de la run() méthode de votre fil à partir de ce point sur votre objet timer appeler le connecté fente dans le thread.
Lorsque vous créez d'abord la minuterie, il sera exécuté à l'intérieur de votre thread principal. En le déplaçant à votre propre thread, comme au-dessus de la moveToThread méthode va changer le fil de l'affinité de l'objet timer.
Le problème, c'est que vous créez la minuterie implicitement par le thread principal lorsque vous créez votre objet thread. C'est parce que votre timer est un membre de votre classe thread.
Lorsque vous essayez de démarrer la minuterie, vous faire dans un thread différent (dans
run()
), pas dans le thread où la minuterie a été créé, qui vous donne l'avertissement.Vous avez besoin pour créer de la minuterie dans le thread où vous voulez l'exécuter:. Modification de la déclaration de
m_notificationTimer
dans votreNotificcationThread
classe deà
et de créer de la minuterie dans
run()
avecIl est également intéressant de mentionner cette l'article
Le plus grand ajustement pour moi a été de comprendre que les fils en qt sont utilisés comme une interface, et ne sont pas vraiment prévu pour le sous-classement. Avec cela étant dit, j'aimerais garder votre classe et réelles et QThread séparé. Puis il suffit d'utiliser YourClass.moveToThread( &YourQtThread) pour assurer vos signaux et les slots sont sur ce thread.