Voici le code de mon implémentation qthread. J'essaie d'obtenir des données GPS par satellite. QThread ne produit pas le signal finished() même lorsque les programmes sortent de la fonction de logement gpsSearch()
. La fonction locateMe()
est appelée à chaque fois qu'un bouton est cliqué. La première fois que le thread n'est pas démarré et que le bouton est cliqué, il imprime la vraie valeur pour la fonction isRunning()
et imprime la valeur false pour la fonction isFinished()
. J'ai dû appeler la fonction quit()
de QTherad pour arrêter manuellement le fil. Après cela, il va à la fonction threadQuit()
connecté dans la classe gnssProvider
. Mais même après cela, si je clique sur le bouton, il imprime la vraie valeur pour isRunning
et false pour isFinished()
dans la fonction locateMe()
.QThread émet un signal finished() mais isRunning() renvoie true et isFinished() renvoie la valeur false
GPSInfo::GPSInfo()
{
hybridGPSFound = satelliteGPSFound = networkGPSFound = false;
qDebug()<<"Thread Creating";
gnssThread = new QThread;
gnssProvider = new LocationFetcher(this,GEOLOCATION_PROVIDER_GNSS,1);
gnssProvider->moveToThread(gnssThread);
connect(gnssThread, SIGNAL(started()), gnssProvider, SLOT(gpsSearch()));
connect(gnssThread, SIGNAL(finished()), gnssProvider, SLOT(threadQuit()));
}
void LocationFetcher::gpsSearch()
{
if (BPS_SUCCESS != geolocation_request_events(0))
{
fprintf(stderr, "Error requesting geolocation events: %s", strerror(errno));
return;
}
geolocation_set_provider(GPS_Search_Provider);
geolocation_set_period(GPS_Search_Period);
while (!stopThread)
{
bps_event_t *event = NULL;
bps_get_event(&event, -1);
if (event)
{
if (bps_event_get_domain(event) == geolocation_get_domain() && bps_event_get_code(event) == GEOLOCATION_INFO)
{
handle_geolocation_response(event);
break;
}
}
}
geolocation_stop_events(0);
this->quit();
}
void GPSInfo::LocateMe()
{
qDebug()<<"Thread Running: "<<gnssThread->isFinished();
qDebug()<<"Thread Running: "<<gnssThread->isRunning();
gnssThread->start();
hybridThread->start();
networkThread->start();
}
Etes-vous sûr que vous n'avez pas mélangé isFinished et isRunning? Vous avez '" Thread Running: "' dans les deux lignes. –
Non, je n'ai pas :) J'étais trop paresseux pour résoudre ce problème: P – Tahlil
pouvez-vous poster l'exemple complet? Peut-être le fil n'a pas fini –