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 :

Création et affichage de 1000 frames = plantage


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Par défaut Création et affichage de 1000 frames = plantage
    Bonjour à tous.

    Je suis en train de faire des tests de performance et voici un cas très simple :

    une form avec un panel (P_Fond).
    Derriere un bouton je vais créer 1000 frames et les affecter à une TObjectList.
    Ensuite avec un autre bouton je vais les rendre visible.

    Et là, deux méthode : avec le panel toujours visible : ce qui me donne une erreur de type : EOsError code 14 mémoire insuffisante...

    Soit en cachant le panel et en affichant qu'a la fin :
    Erreur 1400 Handle de fenêtre non valide.

    Avez vous une idée ? car là même après mes recherches de ce matin sur le forum, rien ne fonctionne ;(

    mon code avec la version panel invisible:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    //bouton de création 
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Frame : TFrame2;
      i : integer;
    begin
      P_Fond.Visible := false;
      OL_Conteneur := TObjectList.create;
      i := 0;
      repeat
        Frame := TFrame2.create(P_Fond);
        Frame.Parent := P_Fond;
        Frame.Align := AlNone;
        Frame.Visible := false;
        Frame.Name := 'F' + IntToStr(i);
        OL_Conteneur.Add(Frame);
        Label1.Caption := IntToStr(i) + ' frames créées';
        Application.processMessages;
        i := i + 1
      until i = 999;
      P_Fond.Visible := true;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      FreeAndNil(OL_Conteneur);
    end;
     
    //affichage
    procedure TForm1.Button3Click(Sender: TObject);
    var
      i : integer;
    begin
      try
      i := 0;
      P_Fond.Visible := false;
      repeat
        TFrame2(OL_Conteneur.Items[i]).Align := AlTop;
        TFrame2(OL_Conteneur.Items[i]).Visible := true;
     
        Label1.Caption := IntToStr(i) + ' frames affichées';
        Application.processMessages;
        i := i + 1
      until i = 999;
      P_Fond.visible := true;
      except
        On E : Exception do
          showmessage(E.Message  + ' ' + IntToStr(i));
      end;
    end;
    et l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet Project2.exe a provoqué une classe d'exception EOSError avec le message 'Erreur système.  Code : 1400.
    Handle de fenêtre non valide'.  Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK   Aide   
    ---------------------------

  2. #2
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Ben y'a pas 36 explications à mon avis :1000 frames, c'est trop, c'est tout. Un ordi, ça n'a pas une mémoire (vive) infinie. Et les handle, ça fait aussi partie de la mémoire.
    Donc quand il ne sait plus en allouer, il te renvoie sans doute 0, ce qui donne un handle invalide évidemment.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre confirmé Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Par défaut
    Salut, merci de ta réponse

    Je ne pense pas que que cela vienne du fait que 1000 frames c'est trop pour la mémoire de mon pc car je dispose d' 1 go de ram et quand je regarde la monté en charge de mon processus et bien ça dépasse même pas les 65 Mo.

  4. #4
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Mais il y a un nombre de handles limité...

  5. #5
    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
    Remplace le Application.ProcessMessages par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    StartTime := GetTickCount();
    Delay := 0;
    while Delay < 1000 do
    begin
       Sleep(1);
       PumpMessages();
       Delay := GetTickCount() - StartTime;
    end;
    J'ai vu ca sur un site où il explique que le problème vient plus de Application.ProcessMessages que de la création du frame.

    Bien sûr c'est à tester, mais bon 1000 frames, je trouve que ca fait quand même un peu beaucoup.
    Modérateur Delphi

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

  6. #6
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Sans compter les composants placés sur les Frames...

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Aucun programme ne créé 1000 fenêtres, cela semble abhérant, ... à quoi pourrait bien servir un tel programme qu'aucun humain ne pourrait utiliser...

    sinon, l'erreur 1400 est souvent provoqué par une manipulation d'une même form entre thread, ou la manipulation en direct du handle de la fenêtre hors dans certains cas, et que le handle aie changé entre son stockage et son utilisation
    Pour les Frames Delphi sollicite un nouveau handle, par exemple, lors du changement de parent ...

    Ensuite la OL_Conteneur ne sert à rien puisqu'il y a P_Fond.Components qui contient déjà la liste des fenêtres, il suffit de faire "P_Fond.Components[I] is TFrame2"

    Enfin, l'utilisation de frame, fut un débat ici et

    EDIT : l'Application.ProcessMessages ne sert à rien sauf pour actualiser le Label ...
    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

  8. #8
    Membre confirmé Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Aucun programme ne créé 1000 fenêtres, cela semble abhérant, ... à quoi pourrait bien servir un tel programme qu'aucun humain ne pourrait utiliser...

    sinon, l'erreur 1400 est souvent provoqué par une manipulation d'une même form entre thread, ou la manipulation en direct du handle de la fenêtre hors dans certains cas, et que le handle aie changé entre son stockage et son utilisation
    Pour les Frames Delphi sollicite un nouveau handle, par exemple, lors du changement de parent ...

    Ensuite la OL_Conteneur ne sert à rien puisqu'il y a P_Fond.Components qui contient déjà la liste des fenêtres, il suffit de faire "P_Fond.Components[I] is TFrame2"

    Enfin, l'utilisation de frame, fut un débat ici et

    EDIT : l'Application.ProcessMessages ne sert à rien sauf pour actualiser le Label ...
    Merci pour vos réponses,

    Cependant 1000 frames et 1000 fenêtres c'est pas tout à fait la même chose... on parle d'afficher un ensemble de composants regroupés dans un cadre pas d'ouvrir 1000 fenêtres...

    Ensuite je tiens à préciser que c'est un test. Ma véritable application plante au bout de 200 frames qui sont répartie dans des Tabsheets pour la création de formulaire. Dans mon cas, les frames ne sont pas détruites au fur et à mesure pour accélerer l'affichage si on retourne dessus (c'est peut être mon erreur donc, il faudrait les détruire)

    Pour la OL_Conteneur, elle ne sert à rien pour notre soucis mais elle figure dans cet exemple pour un autre but. On peut en faire abstraction.

    Le processMessages sert effectivement à rafraichir le label. Si je l'enlève j'aurais le même problème.

    Pour conclure : est ce que le problème vient bien du nombre de Handle qui est limité ? ce nombre n'a rien à voir avec la taille de la mémoire ?
    D'autres suggestions ?

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

Discussions similaires

  1. Affichage de window.frames sur firefox
    Par marry dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/03/2010, 12h03
  2. Affichage d'une frame
    Par soujava dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 17/04/2008, 02h30
  3. Réponses: 6
    Dernier message: 05/02/2007, 14h56
  4. [FLASH 8] input text et affichage d'une frame
    Par trihanhcie dans le forum Flash
    Réponses: 5
    Dernier message: 06/04/2006, 15h58
  5. Réponses: 1
    Dernier message: 19/01/2006, 19h36

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