Vítej, Host. Prosím přihlaš se nebo se zaregistruj.
28.02.2024, 19:54:29

Domů Nápověda Vyhledávání Přihlásit Registrovat
 
Fórum k produktům firmy ELSACO Kolín  

+  PROMOS fórum
|-+  Další firemní SW
| |-+  Ostatní
| | |-+  IEpsnet a Delphi - neuvolňování paměti
0 uživatelů a 1 Host prohlíží toto téma. « předchozí další »
Stran: [1] Dolů Tisk
Autor Téma: IEpsnet a Delphi - neuvolňování paměti  (Přečteno 4494 krát)
libor
moderátor+

Příspěvků: 388



« kdy: 27.09.2013, 10:40:22 »

Využívám na systému PL2, komunikační protokol Epsnet (IEpsnet). Řídící program je napsán v Delphi7 a celé zařízení je řízeno z hlavního PC. Jelikož však komunikační linka je používána ještě dalším zařízením s jiným komunikačním protokolem, tak linku po odečtení uvolňuji, přičemž mi vzniká problém s vícenásobným alokováním paměti.

Nedaří se mi uvolnit paměť. Prosím o radu jak paměť uvolnit. Přikládám výňatek z kódu:
Kód:
procedure TForm1.odmer;
var data : Variant;


begin
  epsnet := CreateOLEObject('Elsaco.Driver.Epsnet.2') As IEpsnet;
  epsnet.SetConnection(Edit3.Text);
  epsnet.SetCurrentStationAddress(StrToInt(Edit4.Text));

  // nacteni dat
  data := epsnet.Read(2, 0, 8);

  // zpracování dat

  // konec zpracování dat

  epsnet.Close();
  epsnet := nil;
end;

Zkusil jsem problém vyřešit přesunutím aktivace epsnetu do spouštěcí části kódu a jeho vymazání (nil) přesunutím do ukončovací části. Výsledkem bylo zacyklení ladiče a tuhnutí celé aplikace. Toto je verze, která funguje z uvedeného nejlépe, ale s každým dotazem zabere další část operační paměti.



Dotaz zaslaný mailem (viz výzva).
Zaznamenáno

libor
moderátor+

Příspěvků: 388



« Odpověď #1 kdy: 27.09.2013, 10:43:07 »

Vytvoření a zrušení objektu epsnet, tj. vytvoření:

Kód:
epsnet := CreateOLEObject('Elsaco.Driver.Epsnet.2') As IEpsnet;

a zrušení:

Kód:
epsnet := nil;

někde v inicializaci a deinicializaci aplikace by fungovat mělo. No a pak ta data. Získáváte je:

Kód:
data := epsnet.Read(2, 0, 8);

což ve výsledku znamená, že funkce Read alokuje paměť (SafeArray) pro výsledný blok dat. Po zpracování těchto dat by jste je měl z paměti uvolnit, tj. v Delphi by mělo stačit:

Kód:
data := nil;

což je napsáno v nápovědě v poznámce, ale není to uvedeno v příkladech, takže to tam doplním.
Zaznamenáno

Stran: [1] Nahoru Tisk 
« předchozí další »
Skočit na:  


Poháněno MySQL Poháněno PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines Validní XHTML 1.0! Validní CSS!