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.
Merci.
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.
solilog
Partager