Hello,
moui ... disons que ce serait sympa si QNetworkReply proposait une methode du genre isFinished ou isRunning, non ? Mais bon pour ça il faudrait lire la doc ... Voire le pied s'il y avait un signal finished, non ?
J'avais déjà vu les isFinished et isRunning, mais de le cas là, ça marchait pas vraiment! Par contre, le slot j'avais pas vu!
Par contre, je me demandais, comme je ne télécharge pas le fichier sur l'ordinateur, mais que je lis juste ligne par ligne dans le fichier, la requête se finit-elle avant ou elle dure tout le traitement?
En fait l'idéal, d'un point de vue user, serait que l'on ne me demande pas de noms de fichiers mais par contre qu'on me propose un dialog avec une progressbar pour savoir où on en est. L'idéal d'un point de vue programmeur, est de downloader les données dans un fichier temporaire (sauf si les le fichier existe et que les données ne sont pas nouvelles), puis de traiter ce fichier si besoin.J'avais déjà vu les isFinished et isRunning, mais de le cas là, ça marchait pas vraiment! Par contre, le slot j'avais pas vu!
Par contre, je me demandais, comme je ne télécharge pas le fichier sur l'ordinateur, mais que je lis juste ligne par ligne dans le fichier, la requête se finit-elle avant ou elle dure tout le traitement?
En ce qui concerne la requete, l'idéal serait de commencer une transaction au début et ne faire un commit que lorsque toutes les données ont été reçues et que tu es certains qu'elles sont valides.
Pour éclaircir un peu le contexte, l'user donne un numéro de gène, et derrière le programme se charge de remplir la base de données avec les informations sélectionnées (identifiant, longueur, organisme, séquence,...) d'une fiche brut qui contient beaucoup plus d'infos disponible sur internet en téléchargement (les données ne change pas).
J'ai pour le moment remplacer "l'attente" par un boite de dialogue qui demande confirmation pour le gène en question.
Le soucis, c'est que je donne la possibilité de rentrer plusieurs gènes d'un coup via un fichier texte rentré par l'user et donc demande confirmation pour chaque gène à chaque fois.
Pas besoin de barre d'état, vu que c'est rapide (moins de 5 s, voir moins d'une s dans certains cas).
ok ... j'avais pas vu que ce tu downloades dépend de l'entrée du user. Il rentre un numéro, ton programme va chercher les infos sur le net et rempli la bdd. Tu utilises ensuite le fait que ta requete est QIODevice pour le traiter ligne par ligne. Ça se tient, aux gestions des erreurs près (connexion rompu=bdd dans un état instable ?).Pour éclaircir un peu le contexte, l'user donne un numéro de gène, et derrière le programme se charge de remplir la base de données avec les informations sélectionnées (identifiant, longueur, organisme, séquence,...) d'une fiche brut qui contient beaucoup plus d'infos disponible sur internet en téléchargement (les données ne change pas).
J'ai pour le moment remplacer "l'attente" par un boite de dialogue qui demande confirmation pour le gène en question.
Le soucis, c'est que je donne la possibilité de rentrer plusieurs gènes d'un coup via un fichier texte rentré par l'user et donc demande confirmation pour chaque gène à chaque fois.
Pas besoin de barre d'état, vu que c'est rapide (moins de 5 s, voir moins d'une s dans certains cas).
Si tu veux rendre la lecture synchrone essaye http://www.developer.nokia.com/Commu...a_Signal_in_Qt
Allez dernière question, pour divulguer le programme, je dois mettre quoi comme dll par rapport à la base de données?
J'ai essayé en rajoutant QSqld4.dll et le plugin qsqlited4.dll mais sur d'autres ordis que le mien, quand il cherche à se connecter, ça met la boite de dialogue erreur avec "Driver not loaded"...
Hello,
il faut déployer toutes les dll que ton programme s'attend à trouver. Soit tu installes Qt sur la machine, soir tu distribues celles qui sont nécessaires (cf par exemple la doc sur http://developer.qt.nokia.com/doc/qt...n-dependencies). Donc à mon avis, il te faudra au moins QtCore, QtGUI,QtNetwork,QtSQL ...
Oui, j'ai oublié de précisé mais toutes les dll "de base", je les ai déjà mis, le programme se lance parfaitement, c'est juste quand le programme doit faire la connexion avec la base qu'il lache et dit "driver not loaded"
Alors essaye de placer le driver sqlite dans un répertoire sqldrivers là où tu déploies l'appli.
De rien, c'était écrit dans la doc dont je t'ai donné le lien.
Je fais un petit retour après longtemps!
C'est bientôt l'heure de rendre le programme, il a subit de belles améliorations, mais pour le bien, il resterait un truc à améliorer.
C'est l'histoire de la récupération d'un fichier par internet avant de le lire ligne par ligne pour en extraire des infos.
Actuellement, je suis obligé de mettre une boite de dialogue pour le programme ait eu le temps de tout récupérer avant de faire le traitement, mais j'aimerai l'enlever pour faciliter le déroulement lors d'ajout de bcp de séquence.
J'ai donc :
J'ai donc vu les fonctions isFinished(), que j'ai mis avant le traitement avec un if, => planteconst QUrl url = QUrl("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&rettype =gb&retmode=text&id="+numero);
const QNetworkRequest requete(url);
QNetworkAccessManager *m = new QNetworkAccessManager;
QNetworkReply *r = m->get(requete);
QMessageBox::information(this, "Confirmation", "Vous allez ajouter le gène : "+numero); // ==> permet l'attente
QString ligne, id, bp, orga, seq2, produit1;
ligne=r->readLine();
j'ai mis une boucle while(r->isRunning()){}, mais que mettre dedans le temps que ça patiente?
J'ai pensé au slot void QNetworkAccessManager::finishe d ( QNetworkReply * reply ), le probleme c'est que le traitement se ferait dans le slot et que ce traitement renvoit un objet...
bref je sais pas trop quoi faire, j'ai aussi essayé de faire une pause, dans le programme mais ça n'a pas marché.
Merci d'avance
Hello,
tu as plusieurs choix :
1. relire mon post #35 (attention l'exemple donné est simple mais peut amener des complications)
2. Faire un peu pro et utiliser les slots. Ce n'est pas si compliqué que ça mais il va peut être falloir modifier un peu tes classes. Il y a un exemple avec une progressbar sur http://qt-project.org/doc/qt-4.8/network-http.html Cette solution est préférable évidemment.
Merci pour tes deux pistes, j'ai essayé de voir la deuxième et je comprends vraiment pas tout ce qui est fait.
J'ai essayé de relier ma fonction à un slot qui prends en charge la lecture ligne par ligne du fichier récupéré d'un internet (rempli l'objet avec les setters),
avec : connect(m, SIGNAL(finished(QNetworkReply* ), this, SLOT(RecupInfo(QNetworkReply*) );
avec m => QNetworkAccessManager *m = new QNetworkAccessManager;
seulement ça ne marche pas, il m'indique : Object::connect: No such slot QWidget::recupInfo(QNetworkRep ly*) in ..\Ptut\fichier.cpp:34
Le programme s'est terminé subitement.
Sinon, est que je peux pas faire une boucle : while(r.isRunning){ pause de 2 sec; } ? Par contre, la pause se fait un QTime non?
Merci
Essaye avec un simple sleep ... ce n'est pas propre (hérétique selon certains ) mais ça devrait passer aux blocages de threads près (? à tester). Sinon réfère-toi à mon post 35 ; ensuite tout dépend si tu veux faire une appli propre destinée à être utilisée donc un minimum robuste ou juste une démo one shot.
- Le sleep marche pas, j'ai vu ailleurs que ça bloquait totalement le programme pendant le temps indiqué, donc la requête ne se récupère pas. Et en effet, ça ne marche pas.
- J'ai essayé la méthode de ton cas post 35, mais ça ne marche pas non plus. J'ai l'impression qu'il ne rentre même pas dans le slot (Qmessage box au début pour voir). J'ai réessayé une méthode avec un autre slot, toujours aucun résultat.
Ca devrait pas être si sorcier quand même! Et j'ai bien envie que mon appli soit utilisé, sinon à quoi bon la faire. Vu le temps que j'y ai mis, c'est un peu un détail mais ça m'arrangerait que ça marche correctement ;( Rien n'y fait!
En tout cas merci de ta patience et de tes réponses