[elektro] OT: delphi memóriakezelés

Info info at kiralyelektronika.hu
Fri Feb 15 01:21:33 CET 2008


Szia !

> El tudod kuldeni a kod(reszletet)?
procedure TThrSafeDBaseManager.GetSignaledLine(Row: DWord; const pBuffer: PByteArray; SignalCol: DWord; const pSignalValue: PByteArray);
begin
  if not Assigned(pBuffer) then Exit;
  FSafeMgr.Enter;
  if Row >= _GetRecordCount then raise EDBException.CreateError(FName, 'TThrSafeDBaseManager.GetSignaledLine', 'index too large');
  _SeekDB(Row);
  Move(pSignalValue^[0], FData^[FColList^[SignalCol].Offset + (FCurrPos - FStartRow) * FRowSize], FColList^[SignalCol].Size);
  Move(FData^[(FCurrPos - FStartRow) * FRowSize], pBuffer^[0], FRowSize);
  FSafeMgr.Leave;
end;

> Egyebkent a delphi alapvetoen objektum orientalt nyelv, a getmem/freemem
> hasznalata nem javasolt.
Ez tökmindegy, memóriát foglal az is, csak kiegészíti a tömböt
méretinformációval. A new és dispose-nak kell a méret a
tipusdeklarációnál, nekem az nincs.
Duplaszóra kerekítve címzek, ezzel sem lehet hiba.

> Elvileg ugy volna szep a megoldasod, hogy letrehozol egy osztalyt ami
> tartalmaz egy megfelelo meretu tombot, majd metoduskent megirod a
> fuggvenyt ami bemasolja a forrasadatot a tombbe.
Pont erről van szó :) (mielőtt belekötne valaki miért írok
adatbázismotor: 1:mert 500 sorra nem illik mást használni 2: mert a
visszatérési idő kritikus, max 1us lehet ami nem megy másképp)

Használtam már mindenféle típusos és típusnélküli mutatóval is, a
jelenség ugyanaz. Az első move nem müxik, a második is csak félig.

Most nekiesek és vesszőről vesszőre átnyálazom a majd 800 sort...grrr

De eszembe ötlött valami: lehet pont az objektum miatt van ez a
problémám: a szelektorokkal a címfordításon keresztül lehetőség nyílik
a memória feldarabolására egy címterületen. Feltételezem ebbe futottam
bele...és pont az a rész nincs a memóriában ami kellene, mert a
hivatkozáskor nincs engedélyezve a buffer teljes területének elérése,
csak a címét tartalmazza az objektum. Nos, meglesem hogy csinálja a
tobject-twriter-tstream...

Mellesleg akkora baromságot csinált a win írója, hogy az allokációs
rutin nem csak pointert adhat vissza hanem handle-t is, hogy csuda.
Ezzel a buggal a globalsize csak a kiindulási címre mondja a méretet,
a buffer közepének címére már nem,mivel ez a fgv is handle-ként kezeli
a dolgot. Így ha egy rutinban range-checking kell kapásból nullának
mondja a bufferem közepét és tilt...k*pják be.



More information about the Elektro mailing list