IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Interrompre une requete


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut Interrompre une requete
    Bonjour

    J'ai une requete paramétrée sur une base de données qui prend pas mal de temps (recherche de POIs pour afficher dans une carte).

    Lors d'un déplacement de carte ou d'un zoom +/-, je veux rafraichir les POIs présents et donc relancer une requête.

    Pour suivre les actions de l'utilisateur, je veux donc pouvoir interrompre une requete précédemment lancée afin d'en lancer une avec de nouveaux paramètres.

    J'ai donc placée cette requête dans un thread en pensant pouvoir arrêter le thread s'il n'est pas fini et le relancer de nouveau ....

    Je constate que ce n'est pas possible et qu'il est impossible d'arrêter le thread tant que la requête qu'il contient n'est pas finie. Même en définissant la requête comme interruptible ....

    Auriez-vous une solution à me proposer ?

  2. #2
    Membre éprouvé Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Points : 1 156
    Points
    1 156
    Par défaut
    Bonjour, et avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ThreadArrête("LeThread",0)//ou
    SQLferme()
    Au travail, le plus difficile, c'est d'allumer la petite lampe du cerveau. Après, ça brûle tout seul!

  3. #3
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Arreter le thread ne fonctionne pas. Visiblement la requête a l'interieur coince et le sqlferme n'a pas d'impact sur un thread qui a son propre contexte ?

  4. #4
    Membre éprouvé Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Points : 1 156
    Points
    1 156
    Par défaut
    et les touches "echap" ou "ctrl+pause" ?
    Au travail, le plus difficile, c'est d'allumer la petite lampe du cerveau. Après, ça brûle tout seul!

  5. #5
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour,

    Utilises tu l'option : hRequêteInterruptible ?
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  6. #6
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Oui... requete interruptible

    Et touche esc pas possible (utilisateur ne voit pas la requete qui est dans le theead)

  7. #7
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Bonjour,

    bien que la démarche semble contre productive je pense que vous devez dégrader votre requête.
    Par exemple vous mettez en place une boucle sur la table principale
    et à l'intérieur de la boucle vous ne ramènez qu'un POI.
    Il est alors facile de passer un paramètre pour sortir de la boucle.

    exemple en pseudo code :

    proc raffraichitPois() // éxecutée dans votre thread
    pour tout xxxxxx
    SI variableGlobaleRaffraichir=vrai alors
    SORTIR
    SINON
    // requete pour 1 POI
    FIN
    FIN

  8. #8
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Oui pas mal l'idee, sauf que ma table est enorme (500000 pois) c'est pour cela que la requete pour isoler les pois sur une zone est longue. Parcourir toute la table ne va pas etre possible a mon avis ...

    Il faudrait donc que je fasse sans doute un geocoding inverse des pois en balayant non pas la table complete mais une table de geocodage referencant les pois par zones .... est ce que quelqu'un a deja fait cela ?

    Cette table serait preparee a l'avance et faire une requete sur cette table serait plus rapide ?

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous,

    A mi chemin entre la proposition de Atsibat et la grosse requête d'un seul bloc, tu pourrais essayer de partitionner le jeu de données pour exécuter n requêtes sur un plus petit nombre de lignes, par exemple 500 exécutions sur 1000 lignes à chaque fois.

    Pour ça il y a l'instruction SQL LIMIT, ou bien encore tu peux utiliser un jeu de données pour déterminer l'intervalle des valeurs utilisées comme condition dans une clause WHERE afin de partitionner les données.

    A chaque itération, ton thread secondaire pourrait surveiller une variable gloable ou un signal levé par le thread principal pour signaler qu'il faut stopper.

    C'est sur, tu vas bien t'amuser !

  10. #10
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    comme on dit je te pulsoie OnePoint
    j'ai mis ça en place pour une table à 2,5 milions de lignes
    je fais de tranches de 15000 lignes avec un LIMIT OFFSET et j'interrompt entre les requêtes.
    Ca marche pas mal mais la coupure n'est pas instantanée, il faut attendre la fin du lot.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    L'idée du "geocoding" est sympa aussi...

    Mais peut-être encore plus sympa (?), certains SGBD offrent des fonctionnalités de représentation de données géométriques et spatiales.

    Par exemple MySQL implémente en partie le modèle géométrique OpenGIS, avec des index R-Trees et des fonctions pour tester les relations entre objets géométriques.
    As-tu déjà regardé de ce côté ?

  12. #12
    Membre éprouvé Avatar de wimbish
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 416
    Points : 1 073
    Points
    1 073
    Par défaut
    Re,

    Rien a voir avec le fil en cours, je reprend l'idée de départ:

    Citation Envoyé par courdi95 Voir le message
    Oui... requete interruptible

    Et touche esc pas possible (utilisateur ne voit pas la requete qui est dans le theead)
    As-tu essayé de simuler l'appui sur la touche Esc avec la fonction EnvoieTouche ? ( est que cela peut arrêter une requête dans un thread secondaire ?)
    Christophe.

    Tous les chemins mènent à Rome http://doc.pcsoft.fr/fr-FR/

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par wimbish Voir le message

    Rien a voir avec le fil en cours, je reprend l'idée de départ:

    As-tu essayé de simuler l'appui sur la touche Esc avec la fonction EnvoieTouche ? ( est que cela peut arrêter une requête dans un thread secondaire ?)
    A mon avis, ça ne fonctionne pas dans un thread secondaire, si cette fonctionnalité d'interruption est gérée au moyen de la file de messages Windows.

    EnvoieTouche alimente la file de messages Windows d'un objet géré par le thread principal.

    Donc déjà il faut envoyer le caractère message "Touche Echap enfoncée" dans la file de message du thread secondaire.

    En principe un thread secondaire peut avoir sa propre file de messages, mais il faut surtout qu'il lise ces messages pour ensuite y réagir (cf. message loop).
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Et je suis quasi certain que les threads secondaires de Windev n'implémentent pas cette fonctionnalité de boucle de messages.
    Donc le message "Touche Echap enfoncée" restera lettre morte, même s'il est bien placé dans la file de messages du thread secondaire.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Citation Envoyé par Atsibat Voir le message
    comme on dit je te pulsoie OnePoint
    j'ai mis ça en place pour une table à 2,5 milions de lignes
    je fais de tranches de 15000 lignes avec un LIMIT OFFSET et j'interrompt entre les requêtes.
    Ca marche pas mal mais la coupure n'est pas instantanée, il faut attendre la fin du lot.
    Merci pour cette idée. Cela semble etre la meilleure piste pour le moment.

  15. #15
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    A mon avis, ça ne fonctionne pas dans un thread secondaire, si cette fonctionnalité d'interruption est gérée au moyen de la file de messages Windows.

    EnvoieTouche alimente la file de messages Windows d'un objet géré par le thread principal.

    Donc déjà il faut envoyer le caractère message "Touche Echap enfoncée" dans la file de message du thread secondaire.

    En principe un thread secondaire peut avoir sa propre file de messages, mais il faut surtout qu'il lise ces messages pour ensuite y réagir (cf. message loop).
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Et je suis quasi certain que les threads secondaires de Windev n'implémentent pas cette fonctionnalité de boucle de messages.
    Donc le message "Touche Echap enfoncée" restera lettre morte, même s'il est bien placé dans la file de messages du thread secondaire.
    J'avais egalement pensé à cette idée, mais complexe à implémenter.

    C'est dingue que pcsoft n'ait pas prévu cette possibilité .....

  16. #16
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    L'idée du "geocoding" est sympa aussi...

    Mais peut-être encore plus sympa (?), certains SGBD offrent des fonctionnalités de représentation de données géométriques et spatiales.

    Par exemple MySQL implémente en partie le modèle géométrique OpenGIS, avec des index R-Trees et des fonctions pour tester les relations entre objets géométriques.
    As-tu déjà regardé de ce côté ?
    Cela m'embete de changer de base (actuellement hfsql c/s) .... mais bon je vais quand meme regarder cela de près.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par courdi95 Voir le message
    J'avais egalement pensé à cette idée, mais complexe à implémenter.

    C'est dingue que pcsoft n'ait pas prévu cette possibilité .....
    Encore plus dingue: les versions des produits PC Soft se succèdent et ça n'est toujours pas implémenté !
    Ils ont préféré nous pondre un organigramme hiérarchique (même pas un vrai un système de graphes)

    Hallucinant, décevant, « c'est minable » comme dirait Jean-Marc !

    (allez c'est pour rire. Je décode pour ceux qui ne suivent pas l'actualité... "Minable" c'est une allusion à la prise de position du 1er ministre français Jean-Marc Ayrault vis de l'exil fiscal annoncé d'un célèbre acteur français)

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par courdi95 Voir le message
    Cela m'embete de changer de base (actuellement hfsql c/s) .... mais bon je vais quand meme regarder cela de près.
    HF C/S ?.... pour ma part je lui suis actuellement infidèle, avec MySQL, et j'envisage la rupture définitive.

    Je ne voulais pas t'inciter à arrêter "séance tenante" tes développements HF C/S. Mais si tu as besoin de gérer et d'analyser des données géographiques, alors il vaut peut être utiliser un SGBD approprié, dans un futur projet.

    Apparemment postgreSQL est aussi très capable dans ce domaine.

  19. #19
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Dans ce cas (postgresql), quel hebergeur me conseillez vous ? Actuellement j'ai ma base chez kalanda.

  20. #20
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Bonjour

    J'ai pas mal avancé depuis mon dernier post et je voudrais partager avec vous mes avancées.

    Motivation :
    Dans un application cartographique, j'ai été confronté à des temps de réponse importants lors des recherches de pois dans une zone donnée, en utilisant une base hyperfile locale. Comme je voulais faire une carte déplaçable à la souris, je déclenchais une recherche à la fin de chaque déplacement de carte à la souris. Le pb rencontré était que les requêtes s'empilent dans le temps, et qu'on ne peut pas les killer une fois lancées, meme dans un thread, donc temps de réponse impossible .... Il y a des astuces qui m'ont ete données ici (découper la recherche en petits morceaux) mais je n'ai pas trouvé cela satisfaisant et cela m'a amené à regarder un autre solution que hyperfileSQL dans cette recherche bi dimensionnelle geographique/spatiale (lat/lon) ...

    Un membre de ce forum m'a conseillé de regarder du côté de bases de données intégrant un vrai moteur géographique, en l'occurence Postgresql avec PostGIS. Après quelques heures de lecture de doc, je confirme que c'est sans doute vers ce type de base qu'il faut aller.

    Deux gros avantages:
    - veritable index spatial/geographique 2d voire 3d
    - possibilite de killer des requetes postgresql

    Essais en cours
    - installation d'une base Postgresql avec Postgis en localhost sur mon PC
    - apprentissage du requetage PostGIS (super intéressant et super puissant !)
    - connexion de Windev vers la base locale
    - réalisation de quelques requêtes simples de Windev vers Postgresql/Postgis
    - création d'une base Postgresql miroir de la base HFSQL
    - transfert des données

    Reste à faire
    - requête en Windev de bornes dans une zone donnée (requete deja validee en sql postgresql)
    - comparaison des temps de réponse avec la base locale hyperfile (à mon avis il n'y aura pas photo) : si comme on le dit, Postgresql est optimisé, il va gagner ...
    - test avec la base chez AlwaysData (provider postgresql postgis)
    - test de cancel query postgresql

    Astuce : en windev, si vous utilisez sqlexec ne pas oublier de faire un sqlconnect avant!

    Cordialement.

Discussions similaires

  1. Interrompre une requete coté serveur
    Par black-key dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 12/11/2013, 21h51
  2. Comment interrompre une requete
    Par didier12 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/05/2011, 13h13
  3. [BDD] Interrompre l'exécution d'une requete
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 09/09/2009, 13h31
  4. Réponses: 1
    Dernier message: 17/04/2008, 15h57
  5. interrompre une requete pour une saisie clavier
    Par ricoree78 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 24/11/2006, 16h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo