Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Programın Ram üzerinde kapladığı alan hk.
#11
(24-01-2019, Saat: 13:10)theSinan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(23-01-2019, Saat: 17:27)wiseman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Sevgili Meslektaşlarım,

sorunu çözmek için en son yol olarak, bellek temizleme çözümüne gittim ve aşağıdaki fonksiyonla sorunumu çözdüm. Bu tip sorunlarla karşılaşan arkadaşlarım olursa diye, fonksiyonu paylaşıyorum. 340 Mb lik dosyayı 2.3 Mb ye düşürüyor.

procedure TrimAppMemorySize;
var
 MainHandle : THandle;
begin
 try
   MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
   SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
   CloseHandle(MainHandle) ;
 except
 end;
 Application.ProcessMessages;
end;

S.a Hocam Fonksiyonu Ne Zaman Çalıştıracağız

Fonksiyonu dilerseniz programın başlangıcından hemen sonra, ya da büyük bir proses çalıştırdıktan sonra uygulayabilirsiniz.

(24-01-2019, Saat: 13:17)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bellek kullanımı sürekli artıyorsa hatayı bulup düzeltmek daha doğru olsa gerek.

Bazen bir yerlerde FREE'si eksik CREATE'ler unutulabiliyor.

Selamlar

Kodun tamamını paylaştım zaten sizinle. Bu işlem bittikten sonra, memo daki değerler veri tabanına insert ediliyor. Create ya da free olacak bir alan varsa yazdığım kodda, bana düzenleyip yazarsanız memnun olurum.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#12
(22-01-2019, Saat: 12:49)wiseman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Cevap veren arkadaşlarıma çok teşekkür ederim. Öncelikle, veritabanına yazma işlemi, ilk etapta başlamadığından dolayı, alanların büyük olmasının çok önemi olmadığını düşünüyorum. İkinci olarak, program içerisinde herhangi bir değişken tanımlı değil. veriler döngü ile anlık olarak okunup, bir memo alana kaydedilip connection kapatılıyor. Sonrası da mysql insert başlıyor. Koda gelince sadece aşağıdaki gibidir.


procedure Tfrmmain.plcoku(Sender: TObject);
var
 Data: Array of Variant;
 Index: Integer;
 Count: Integer;
 Display: String;
begin
 SetLength(Data, DataCount);
 Count:=0;
 While Count < DataCount do
 begin
   Index:=(Count * DataSize) + DataOffset;
   Case DataType of
     0: Data[Count]:=oku_Dave.GetFloat(Index);
   end;
   Inc(Count);
 end;
 Index:=0;
 While Index < DataCount do
 begin
   Display:='' + Format('%10s', [VarToStr(Data[Index])]);
   memo1.Lines.Add(trimleft(display));
   Inc(Index);
 end;
 plc_connect.Active := false;
end;

Uygulamanızda Memory Leak var mı öncelikle onu sorayım. ReportMemoryLeaksOnShutDown := true ile çalıştırın ve bir müddet sonra uygulamayı kapatın bir hata alıyor musunuz ? İkinci olarak sürekli artan bir hafıza ile mi karşı karşıyasınız ?

Böyle bir durum var ise kesinlikle hafıza sızıntısı vardır. Kodu ciddi anlamda incelemek gerekir. Örneğin yukarıdaki kod'da ne olur ne olmaz diye Data := nil; atamasını yapmanızı önerebilirim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#13
@wiseman kodların içerisinde
memo1.Lines.Add(trimleft(display));
şeklinde bir satır var memo1 içeriği ne zaman temizleniyor.
hiç durmadan memo alana bir şeyler mi yazılıyor banamı öyle geldi
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#14
(24-01-2019, Saat: 18:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-01-2019, Saat: 12:49)wiseman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Cevap veren arkadaşlarıma çok teşekkür ederim. Öncelikle, veritabanına yazma işlemi, ilk etapta başlamadığından dolayı, alanların büyük olmasının çok önemi olmadığını düşünüyorum. İkinci olarak, program içerisinde herhangi bir değişken tanımlı değil. veriler döngü ile anlık olarak okunup, bir memo alana kaydedilip connection kapatılıyor. Sonrası da mysql insert başlıyor. Koda gelince sadece aşağıdaki gibidir.


procedure Tfrmmain.plcoku(Sender: TObject);
var
 Data: Array of Variant;
 Index: Integer;
 Count: Integer;
 Display: String;
begin
 SetLength(Data, DataCount);
 Count:=0;
 While Count < DataCount do
 begin
   Index:=(Count * DataSize) + DataOffset;
   Case DataType of
     0: Data[Count]:=oku_Dave.GetFloat(Index);
   end;
   Inc(Count);
 end;
 Index:=0;
 While Index < DataCount do
 begin
   Display:='' + Format('%10s', [VarToStr(Data[Index])]);
   memo1.Lines.Add(trimleft(display));
   Inc(Index);
 end;
 plc_connect.Active := false;
end;

Uygulamanızda Memory Leak var mı öncelikle onu sorayım. ReportMemoryLeaksOnShutDown := true ile çalıştırın ve bir müddet sonra uygulamayı kapatın bir hata alıyor musunuz ? İkinci olarak sürekli artan bir hafıza ile mi karşı karşıyasınız ?

Böyle bir durum var ise kesinlikle hafıza sızıntısı vardır. Kodu ciddi anlamda incelemek gerekir. Örneğin yukarıdaki kod'da ne olur ne olmaz diye Data := nil; atamasını yapmanızı önerebilirim.

Tuğrul Hocam,

Program açılır açılmaz timer çalışıyor. Her 5 dakikada bir bu timer devreye girerek kodu çalıştırıyor. Buradaki kodun işlevi bitince, PLC den connection koparılıyor zaten kodda görüldüğü üzere. Akabinde, hemen mysql veritabanına connection sağlanıyor. Memo içerisindeki veriler insert ediliyor. Memo boşaltılıyor. Başka da kod yok programımda. Benim ram boşaltarak çözdüğüm sorunum şu : Windows 10 Enterprise olan PC de, daha exe çalışır çalışmaz 340 Mb olarak açılıyor. Ama derleme boyutu 24 Mb. Windows 10 Pro PC de sadece 30 Gb olarak açılıyor. Aynı exe. Sadece işletim sistemi farklı. 340 Mb de sabit kalıyor. MySQL insert işlemi sırasını da takip ettim. 350 Mb. ye kadar çıkıyor, sonra tekrar 340 Mb. ye iniyor boyut. Sıkıntım bu. Çözüm olarak ta fonksiyonla çözebildim. Hala araştırıyorum, işletim sisteminde fazladan çalışan servisler mi bu bıyuta getiriyor exe yi, yoksa farklı bir sorun mu var? Nil, Free vb. yapabileceğim bir create işlemim yok.

(24-01-2019, Saat: 18:47)adelphiforumz Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@wiseman  kodların içerisinde
memo1.Lines.Add(trimleft(display));
şeklinde bir satır var memo1 içeriği ne zaman temizleniyor.
hiç durmadan memo alana bir şeyler mi yazılıyor banamı öyle geldi

Selamlar

Memodan bilgiler döngü ile MYSQL veri tabanına insert edildikten hemen sonra memoyu temizliyorum. Zaten bu bilgilerin insert işlemi en çok 5 saniye sürüyor.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#15
Bir üsadımız araştırma yaparken bu makale denk gelmiş...
Windows 10 da DLL yüklediğinizde, DLL içerisinde ki tüm değişkenler için ram de yer ayrlılıyor... 

Eğer harici DLL kullanımı varsa bu da etkileyebilir...
Girdim İlim Meclisine, 
Eyledim Kıldım Talep, 

Dediler İlim Geride, 
İlla Edep İlla Edep.

Yunus Emre
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  timage üzerinde mouse ile çizim duraumsa 0 57 02-09-2019, Saat: 16:16
Son Yorum: duraumsa
  Çözüldü Fastreport degisken alan yazdırma cinarbil 5 556 25-04-2019, Saat: 16:37
Son Yorum: cinarbil
  Token için Alan Boyutu Fesih ARSLAN 9 655 08-03-2019, Saat: 12:08
Son Yorum: yhackup
  Tablodaki alan isimlerini listelemek baloglurecep 4 416 10-01-2019, Saat: 09:19
Son Yorum: elixir84
  Text alan tanımlaması hk. cmenevse 11 1.196 24-10-2018, Saat: 10:27
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi