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 :

BlokMove entre 2 TList


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 107
    Points : 237
    Points
    237
    Par défaut BlokMove entre 2 TList
    Bonjour à tous,

    Une petite question pour terminer l'année.
    Je cherche à accélérer la procédure ci-dessous.
    Je voudrais remplacer la boucle for ... Tlist.Add(...); Tlist.Add(...); (avec les 2 TList
    par le code en (* *) qui fonctionne toujours d'en 1 sens Right: quand la page Dst est créée après la page Sefl)
    mais déconne "parfois", mais toujours dans le sens Left: quand la page Self est postérieure à Dest (PageId>).
    Tout fonctionne, avec la boucle, mais je voudrais speeder le process, vu qu'il fait des milliers, millions de MoveBlocksur des milliers de pages qui contiennent chacune 2 TList. Je peux aussi utiliser le move dans un sens et la boucle dans l'autre mais
    si vous connaisser une proc pour déplacer des blocks de pointeurs entre TList ce serait sympa.
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    unit Unit1;
     
    interface
     
    type
      tPage = class
      private
        vModif   : boolean;                          // page modif ?
        vPageId  : cardinal;                         // Id (unique)
        vCursor  : Integer;                         // Current Elem
        vElems,
        vLinks   : tList;
        function    GetLink (Const xPos:integer) : tPage;
        procedure   SetLink (Const xPos:integer; Const aLink:tPage);
        function    GetElem (Const xPos:integer) : ptElem;
        procedure   SetElem (Const xPos:integer; Const aElem:ptElem);
        function    GetMax : integer;
      public
        constructor Create  (Const aPageId:cardinal);   overload;
        constructor Create  (Const aPageId:cardinal; Const aElem: ptElem; Const aLink: tPage); overload;
        procedure   Free;
     
        function    Dichoto     (Const aElem: ptElem; Compare: tCompare; var Posi: Integer) : boolean;
        procedure   InsertAt    (Const aPos: Integer; Const aElem: ptElem; Const aLink: tPage ); overload;
        procedure   RemoveAt    (Const aPos: Integer);
        procedure   Add         (Const aElem: ptElem; Const aLink: tPage); overload;
        procedure   MoveBlock   (Const SrcPos: Integer; Const DstPage: tPage; Const DstPos, NbMove:Integer);
     
        property    PageId  : cardinal  read vPageId  write vPageId;
        property    Modif   : boolean     read vModif;
        property    MaxElem : Integer     read GetMax;
        property    Cursor : integer read vCursor  write vCursor;
        property    Links [Const xPos:integer] : tPage  read GetLink  write SetLink;
        property    Elems [Const xPos:integer] : ptElem read GetElem  write SetElem;
      end;
     
    implementation
     
    procedure   tPage .MoveBlock (Const SrcPos: Integer; Const DstPage: tPage; Const DstPos, NbMove: Integer);
    var i : integer;
    begin
    (*
      // OK : agrandir la taille des TList avant le move
      DstPage.vElems.Count := DstPage.vElems.Count + NbMove;
      DstPage.vLinks.Count := DstPage.vLinks.Count + NbMove;
      // KO dans un move Left (si la page Dest a été créée avant la page Self
      move ( Self.vElems.List[SrcPos], DstPage.vElems.List[DstPos], NbMove*SizeOf(pointer));
      move ( Self.vElems.List[SrcPos], DstPage.vElems.List[DstPos], NbMove*SizeOf(pointer));
    *)
     with DstPage do
     for i := 0 to NbMove-1 do
     begin
      vElems.Add(Self.Elems[i+SrcPos]);
      vLinks.Add(Self.Links[i+SrcPos]);
     end;
     // remove from Self page
     vElems.Count := vElems.Count - NbMove;
     vLinks.Count := vLinks.Count - NbMove;
    end;  //  tTree.MoveBlockElems
     
    end.
    Merci.
    solilog

  2. #2
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 107
    Points : 237
    Points
    237
    Par défaut
    Re bonjour

    Je referme mon post comme résolu, j'ai trouvé, je le dis quand même :-)
    Le MoveBlock entre TList (sur TLIST.List) çà marche mais pas dans une méthode de classe, j'ai fait ceci et çà marche.
    (mais je ne gagne pas grand chose en vitesse, 3, 4 %).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure List_MoveBlock( Src, Dst :TList; SrcPos, DstPos, NbMove:Integer);
    begin
      Dst.Count := Dst.Count + NbMove;
      move ( Src.List[SrcPos], Dst.List[DstPos], NbMove*SizeOf(pointer));
      Src.Count := Src.Count - NbMove;
    end;  //  procedure List_MoveBlock
     
    procedure   tPage .MoveBlock (Const SrcPos: Integer; Const DstPage: tPage; Const DstPos, NbMove: Integer);
    var i : integer;
    begin
      List_MoveBlock( Self.vElems, DstPage.vElems, SrcPos, DstPos, NbMove);
      List_MoveBlock( Self.vLinks, DstPage.vLinks, SrcPos, DstPos, NbMove);
    end;  //  tTree.MoveBlockElems
    Bonne année à tous.
    solilog

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

Discussions similaires

  1. Liaison entre un DataGrid et un TList
    Par Wil14 dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 01/07/2011, 09h45
  2. 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
  3. TList partagée entre deux process.
    Par swirtel dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/01/2005, 11h48
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05

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