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