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

Composants FMX Delphi Discussion :

Difference entre Create(Self) et Create(Nil)


Sujet :

Composants FMX Delphi

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Par défaut Difference entre Create(Self) et Create(Nil)
    Bonjour,

    Récemment j'ai trouvé un bug dans mon application FMX en utilisant des Threads (erreur de segmentation(11)).

    J'avais pris pour habitude de créer mes objets en utilisant .Create(Self) mais de temps en temps, ça plante .

    J'ai modifié la création de mes objets avec .Create(Nil) et depuis je n'ai plus ce problème!

    Exemple de fonction :

    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
    procedure TData.GetPlanning(DateProd : String;T : TVirtualTable);
    Begin
      tthread.CreateAnonymousThread(
      procedure
      var
          Client   : TRestClient;
          table    : TVirtualTable;
          Request  : TRestRequest;
          Response : TRestResponse;
          Adapter : TRestResponseDataSetAdapter;
      begin
      Table := TVirtualTable.Create(Nil);
      Table.Open;
      T.Clear;
      Client   := TRestClient.Create(Nil);
      Request  := TRestRequest.Create(Nil);
      Adapter := TRestResponseDataSetAdapter.Create(Nil);
      Response := TRestResponse.Create(Nil);
      Adapter.Response := Response;
      Adapter.Dataset := Table;
      Request.Client := Client;
      REquest.Response := Response;
      Client.BaseURL := BASE_URL2;
      Client.AddParameter('action','get_planning_bis');
      Client.AddParameter('date_prod',DateProd);
      Request.Execute;
      tthread.Synchronize(nil,
      procedure
      begin
        if Not Table.IsEmpty then
        Begin
          T.Assign(Table);
          T.FieldByName('id').Visible := False;
          T.FieldByName('decouverte').Visible := False;
        End;
      End);
      end).Start;
    End;
    J'ai pu lire dans un autre post que Create(Self) sers à gérer la destruction des composants à la destruction du Owner, mais je ne vois pas pourquoi dans mon cas cela a une incidence...?

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Bonjour,

    tout à fait, attribuer un Owner permet de s'assurer que l'objet est détruit quand son Owner est détruit...mais ça implique donc que l'objet existera jusqu'à ce que le Owner soit détruit (ça peut être long)

    Le problème ici c'est que tu fais cette création depuis un Thread secondaire, et là c'est risqué car on ne sait pas ce que le Owner est en train de faire pendant ce temps dans le thread principal.

    Donc il est tout à fait valide de ne pas mettre de Owner (nil) mais dans ce cas il faut explicitement libérer l'objet quand il n'est plus utile...en l'occurrence tu ne détruis aucun des objets créé dans le thread.

    à priori ton code pourrait s'écrire comme 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
    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
     
    procedure TData.GetPlanning(DateProd : String;T : TVirtualTable);
    Begin
      tthread.CreateAnonymousThread(
      procedure
      var
          Client   : TRestClient;
          table    : TVirtualTable;
          Request  : TRestRequest;
          Response : TRestResponse;
          Adapter : TRestResponseDataSetAdapter;
      begin
      Table := TVirtualTable.Create(Nil);
      try
        Table.Open;
        // T.Clear; <-- ça me semble de trop et à ne pas faire dans le Thread, éventuellement dans le Syncrhonize
        Client   := TRestClient.Create(Table);
        Request  := TRestRequest.Create(Table);
        Adapter := TRestResponseDataSetAdapter.Create(Table);
        Response := TRestResponse.Create(Table);
        Adapter.Response := Response;
        Adapter.Dataset := Table;
        Request.Client := Client;
        REquest.Response := Response;
        Client.BaseURL := BASE_URL2;
        Client.AddParameter('action','get_planning_bis');
        Client.AddParameter('date_prod',DateProd);
        Request.Execute;
        tthread.Synchronize(nil,
        procedure
        begin
          T.Clear; // ici
          if Not Table.IsEmpty then
          Begin
            T.Assign(Table);
            T.FieldByName('id').Visible := False;
            T.FieldByName('decouverte').Visible := False;
          End;
        End);
      finally
        Table.Free;
      end; 
      end).Start;
    End;
    on s'assure que Table est détruit, et en le nommant Owner des autres, ils le sont aussi
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Par défaut
    Je pensais (naivement) que les composants étaient libérés automatiquement à la fin de la fonction .

    Pour le T.Clear, je me suis dis que ce n'était pas ce qui allait ralentir le tout, mais comme on dit qui peut le plus peut le moins c'est vrai que c'est plus logique comme ça ..!

    Et c'est vrai que je n'avais pas penser à tout affecter à un composant pour en avoir qu'un à libérer, c'est tout bête, mais sur la centaine de fonctions que je vais reprendre c'est un gros gain de temps !!

    Merci !!

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

Discussions similaires

  1. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 20h09
  2. difference entre grant create & grant create any
    Par bm_oracliste dans le forum Oracle
    Réponses: 2
    Dernier message: 25/11/2007, 08h46
  3. Difference entre fenetre et boite de dialog
    Par billyboy dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2003, 15h43
  4. [] Difference entre MSHFlexGrid et MSFlexGrid
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 23/04/2003, 08h48
  5. Difference entre types d'Adresse IP
    Par freud dans le forum Développement
    Réponses: 3
    Dernier message: 02/03/2003, 02h06

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