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

Langage Delphi Discussion :

Query.open -> Operation de pointeur incorrecte


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut Query.open -> Operation de pointeur incorrecte
    Salut

    J'ai un prog sur écrans tactiles qui tourne exclusivement avec des TQuery.

    De manière aléatoire, l'une ou l'autre query du programme déclenche une erreur "Opération de pointeur incorrecte".
    En traçant à l'aide logs, ça plante sur cette fonction du composant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TRxADOQuery.OpenCursor(InfoQuery: Boolean);
    begin
      ExpandMacros;
      inherited OpenCursor(InfoQuery);
     
    end;
    et c'est la ligne OpenCursor qui déclenche l'erreur.

    Le code SQL de la query, quelle qu'elle soit, est toujours correct (aussi vérifié grâce aux logs).

    Qu'est-ce qui peut faire que différentes requêtes d'un programme plantent aléatoirement à l'ouverture ?

    Elles ne sont jamais détruites en cours d'exécution, et sont gérées par un datamodule.

    Les requêtes sont exécutées plusieurs centaines de fois en une journée, et je ne vois qu'un ou deux plantages par poste / jour.

    Merci pour vos lumières.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 097
    Par défaut
    EInvalidPointer - "Operation de pointeur incorrecte" c'est en général un Free qui le génère sur la libération d'un pointeur déjà libéré

    Cela arrive si deux TObjectList en OwnObject libère le même objet par exemple
    Cela peut se produire avec une TObjectList et un TDataModule comme Owner si l'on passe la Query dans la TObjectList

    Si c'est vraiment au tout début, à l'ouverture
    Est-ce que l'ordre des créations des objets est-il le bon ?

    As-tu des threads, parfois l'un ou l'autre va plus vite que prévu et tu as oublié de mettre des sections critiques
    D'ailleurs, attention, ne partage pas le même objet Connection par plusieurs thread qui lancerait différentes Query, il se mélangerait les pinceaux

    Je me rappelle d'un TMyConnection très instable dans un vieux programme parce que j'écrivais n'importe quoi n'importe où

    Si ton erreur se produit peu plus tard, lorsque le programme tourne

    Il est possible que ce ne soit pas CE code le coupable mais un autre !
    Ailleurs, dans une boucle par exemple, tu balayes un buffer ou un tableau et tu dépasses !
    Pas de chance, tu modifie à cet endroit d'autres variables, et peut-être certains éléments d'un objet Query, un pointeur sur un objet par exemple

    Et c'est pour cela que c'est peu fréquent, il faut d'abord que l'autre code "pourrisse" suffisamment de mémoire pour que tout en soit perturbé !


    L'autre possibilité c'est un bug du TRxADOQuery, est-ce ta proche couche de donnée héritée de TADOQuery ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    TRXAdoQuery est un mix que j'ai fait à partir d'une TADOQuery en y ajoutant les spécificités d'une RXQuery. Cela fait des années que je l'utilise, et je n'ai pas encore rencontré ce genre de problème sur d'autres projets.

    Cela ne se produit pas à l'ouverture, uniquement en cours d'exécution.
    Et ce prog n'utilise pas de threads.

    Va peut-être falloir que je surveille un peu plus les plantages, et voir si c'est toujours la même ligne de code qui déclenche l'erreur.

  4. #4
    Membre expérimenté Avatar de Moez.B
    Homme Profil pro
    Développeur Delphi
    Inscrit en
    Mars 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 219
    Par défaut
    Salut

    Essaie de détecter les fuites mémoires en quittant l'application avec ReportMemoryLeaksOnShutdown à True, ou bien en incluant la library de FastMM4.
    Sinon, il faut déboguer le OpenCursor pour voir d'où ça vient cette erreur.
    Généralement c'est un accès à un membre déjà détruit ou pas encore créé. Puisque c'est un cas spécifique, il faut surveiller aussi les rows puisque OpenCursor ramène un ensemble de données. Faudra-peut être un contrôle métier en plus

    Bonne journée.

  5. #5
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    Je pense avoir trouvé de quoi il s'agit.

    J'ai un timer qui se déclenche toutes les 10 sec. pour rafraichir les données.
    Chaque fois qu'un utilisateur clique qqpart, je désactive le timer.

    Or, je viens de découvrir que la syntaxe timer.enabled:=false exécute une dernière fois le code du timer. Et cela peut évidemment générer des conflits entre ce que le timer est censé rafraichir, et ce que l'utilisateur à cliqué.

    Je viens de déployer une nouvelle version dans laquelle j'empêche le timer d'exécuter son code s'il est disabled. Je serrai vite fixé si cela a résolu le problème ou non.

Discussions similaires

  1. POO - Operation de pointeur incorrect sur Free
    Par Diablo64 dans le forum Langage
    Réponses: 9
    Dernier message: 17/03/2009, 13h46
  2. [VC++ 2005] Pointeur incorrect
    Par Rafoo dans le forum MFC
    Réponses: 3
    Dernier message: 25/09/2006, 15h44
  3. operator< et pointeur
    Par yoda1410 dans le forum C++
    Réponses: 2
    Dernier message: 17/02/2006, 10h51
  4. Opération pointeur incorrecte
    Par rsc dans le forum Langage
    Réponses: 16
    Dernier message: 24/01/2006, 09h13
  5. Réponses: 4
    Dernier message: 04/08/2005, 14h15

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