[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