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

Delphi Discussion :

Plantage programme delphi: Handle de fenêtre non valide


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 211
    Par défaut Plantage programme delphi: Handle de fenêtre non valide
    Bonjour,

    J'ai un petit programme Delphi que je lance sur mon pc et qui plante systématiquement. Je m'explique:
    - Le programme fait des calculs et discute avec une base de données, une fois que je le lance il tourne environ 5 min.
    - Sur mon pc de travail le processus plante au bout d'un moment (aléatoire à priori) et occupe 100% du cpu mais n'avance plus.
    - Sur mon pc portable le programme se déroule en entier sans soucis.

    Plus bizarre encore lorsque je force l'arrêt de mon programme une fois qu'il est planté ... c'est l'explorer.exe qui prend alors 100% du cpu !!! et cela uniquement sur mon pc de travail.
    J'ai parfois l'erreur suivante :
    "Erreur système, code : 1400 handle de fenêtre non valide"

    Je travail en multiécran (j'apporte cette précision car certaines recherches sur internet m'ont apporté des possibles erreurs due à cela.

    Si vous avez des idées je suis + que preneur !

    Merci

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Peux tu faire voir ton code qui fait le calcul ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Ce serait bien aussi de connaitre les différences entre les 2 PC :
    - taches de fond active (antivirus)
    - puissance de calcul (micro-processeur, carte graphique)

    ainsi qu'une description du plantage (écran bleu, ou "ce programme ne répond plus"-->utilisation indiquée de application.processmessage)

    Remplis tu une liste quelque part (TStringList, TListView, TMemo, TStringGrid -->utilisation des méthodes BeginUpdate, EndUpdate peut être nécessaire)

    etc...
    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 211
    Par défaut
    il n'y a pas qu'un calcul le code est assez complexe et je ne peux pax vraiment le copier coller ici. il y a des calculs et bcp d'accès à une base de données (distante).

    pour l'instant je ne l'ai testé que sur 2 pcs mais je vais le lancer sur d'autres pcs.

    sur mon pc de bureau (Pentium IV 3Ghz + 1Go de RAM GeForce 5200) il plante (y compris si je le lance tout seul au lancement de Windows) et sachant que j'ai formaté une première fois qd j'ai eu ce problème. Donc mon install est propre.

    Le plantage apparait sous la forme de ma fenêtre qui ne se rafraichit plus et par le fait que le processus prend 100% du cpu (en fait 50% car il y a l'hyperthreading). Lorsque je le fait CTR-F2 pour arrêter mon appli cela fonctionne mais c'est alors Explorer.exe qui prend 100% du cpu !!!

    Mon portable est un Core2Duo 2Ghz + 2GoRam + ATI X1400. La le programme tourne sans soucis.

    Je vais tester sur le poste de 2 collègues (dont un qui a 2 écrans également).

    Sinon oui j'utilise de nombreux objets et également des StringList.

    Merci pour votre aide

  5. #5
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Déjà, ce serait pas mal si, avant le remplissage de tes stringlist (rattachées ou nom à des composant graphiques : TMemo.Lines), tu écrive ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var MaListe:TStringList;
         Memo1:TMemo;
    ....
    //avant le traitement long
    MaListe.BeginUpdate;
    Memo1.Lines.BeginUpdate;
    ...
    //Traitement long
    for i:=0 to 150000 do
       MaListe.Add('Une Ligne de Texte');
    ...
    //après le traitement long
    MaListe.EndUpdate;
    Memo1.Lines.EndUpdate;
    Celà accélèrera sensiblement les traitements.

    De même, si tu parcours les champs d'une base de données et que tu as des contrôles DB-aware qui y sont reliés, ce ne serait pas un mal de désactiver l'affichage des données dans ces composants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var MaTable:TTable;
    ...
    //avant le traitement long
    MaTable.DisableControls;
    ...
    //Traitement long
    MaTable.First;
    while not Matable.eof do
    begin
       Matable.FaireQuelqueChose(Lecture ou ecriture de donnees); //<--exemple fictif ;)
       MaTable.Next;
    end;
    ...
    //après le traitement long
    MaTable.EnableControls;

    Et sinon, laisse la main de temps en temps au système, en plaçant en fin de boucle dans ton traitement long, des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ProcessMessages;
    Celà évitera à Windows de se figer (dessin de la fenêtre et terminaison de processus) et te permettra de prendre la main sur ton programme pour l'arrêter (le message windows qui termine ton application lorsque tu tues son processus via le gestionnaire des tâches sera alors traité par ton programme)

    Honnêtement, ça devrait améliorer sensiblement les choses.

  6. #6
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Sinon, les messages du type Handle de fenètre non valide, ça craint
    Soit tu as créés beaucoup trop de contrôles fenétrés (TForm, TPanel, TLabel) et tu remplies la mémoire de windows chargée de gérer les handle de fenètre qui n'en peu plus.
    Soit tu recrées une instance d'un contrôle fenétré déjà existant (TForm, TPanel, TLabel), sans avoir pris soin de détruire l'instance déjà existante.
    Soit tu affecte accidentellement la propriété Handle d'un de tes contrôle fenétré (TForm, TPanel, TLabel); --> à éviter.
    Soit tu utilise des composants tierce partie mal codés ou mal adaptés à ta version de delphi (ça m'est déjà arrivé). D'ailleurs, ça m'est déjà aussi arrivé avec un ensemble d'experts (cnPack), j'ai désinstallé et tout est rentré dans l'ordre.
    Soit tu crés des instance de fenètre (handle de fenètres HWND) ou de resources graphiques (handle de dessin HDC avec la fonction windows GetDC) que tu ne libères jamais (ReleaseDC))

    Les raisons peuvent être multiples

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD12] handle de fenêtre non valide
    Par gbzmt dans le forum WinDev
    Réponses: 4
    Dernier message: 05/11/2013, 11h02
  2. Handle de fenêtre non valide
    Par ired dans le forum Langage
    Réponses: 17
    Dernier message: 26/04/2010, 11h40
  3. Handle de fenêtre non valide
    Par bernie.noel dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 18h48
  4. Réponses: 17
    Dernier message: 22/09/2006, 08h37
  5. Handle de fenètre non valide
    Par minnit_s dans le forum C++Builder
    Réponses: 4
    Dernier message: 01/01/2006, 19h26

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