Uzun süredir çalışan uygulamalar yazarken - günün büyük bölümünü görev çubuğuna küçültülecek program türleri veya Sistem tepsisi, bellek kullanımı ile programın 'kaçmasına' izin vermemek önemli olabilir.
En sağdaki iki sütun CPU (zaman) kullanımını ve bellek kullanımını gösterir. Bir işlem bunlardan herhangi birini ciddi şekilde etkiliyorsa, sisteminiz yavaşlar.
CPU kullanımını sık sık etkileyen şey, döngü oluşturan bir programdır (bir dosya işleme döngüsüne "sonraki oku" ifadesini koymayı unutmuş herhangi bir programcıdan isteyin). Bu tür problemler genellikle kolayca düzeltilebilir.
Öte yandan, bellek kullanımı her zaman belirgin değildir ve düzeltilenden daha fazla yönetilmesi gerekir. Örneğin, bir yakalama türü programının çalıştığını varsayalım.
Bu program gün boyunca, muhtemelen bir yardım masasında telefon görüşmesi veya başka bir nedenden dolayı kullanılır. Her yirmi dakikada bir kapatmak ve sonra tekrar başlatmak mantıklı değil. Nadiren de olsa gün boyunca kullanılır.
Bu program bazı ağır dahili işlemlere dayanıyorsa veya formlarında çok fazla sanat eseri varsa, er ya da geç
hafıza kullanımı büyüyecek, diğer daha sık işlemler için daha az bellek bırakacak, disk belleği etkinliğini artıracak ve sonuçta bilgisayarı yavaşlatacak.Diyelim ki ana form ve iki ek (modal) form içeren bir program tasarlayacaksınız. Genellikle, Delphi sürümünüze bağlı olarak, Delphi formları proje birimi (DPR dosyası) ve uygulama başlangıcında tüm formları oluşturmak için bir satır içerecektir (Uygulama. CreateForm (...)
Proje ünitesine dahil edilen hatlar Delphi tasarımına aittir ve Delphi'yi bilmeyen veya kullanmaya yeni başlayanlar için mükemmeldir. Rahat ve yararlı. Ayrıca, program başlatıldığında TÜM formların oluşturulacağı ve gerektiğinde DEĞİL oluşturulacağı anlamına gelir.
Projenizin ne hakkında olduğuna ve bir formu uyguladığınız işlevselliğe bağlı olarak çok fazla bellek kullanabilir, bu nedenle formlar (veya genel olarak: nesneler), yalnızca ihtiyaç duyulmadığında oluşturulmalı ve yok edilmeli (serbest bırakılmalıdır) oluşturulmalıdır. gerekli.
"DialogForm" ve "OccasionalForm" öğelerinin "Formları otomatik oluştur" listesinden kaldırılması ve "Kullanılabilir formlar" listesine taşınması gerekir.
Burada belirtilen stratejinin, söz konusu programın gerçek zamanlı bir “yakalama” türü program olduğu varsayımına dayandığını lütfen unutmayın. Bununla birlikte, parti tipi işlemler için kolayca uyarlanabilir.
Delphi bunu en aza indirmeye çalıştı ve çok daha küçük bloklar kullanan kendi bellek yönetimi mimarisine sahip. Windows ortamında neredeyse işe yaramaz çünkü bellek tahsisi sonuçta işletim sistemine aittir.
Windows bir işleme bir bellek bloğu ayırdığında ve bu işlem belleğin% 99,9'unu serbest bırakırsa, Blokun yalnızca bir baytı gerçekte olsa bile, Windows tüm bloğu kullanımda olarak algılayacaktır. Kullanılmış. İyi haber, Windows'un bu sorunu temizlemek için bir mekanizma sağlamasıdır. Kabuk bize adlı bir API sağlar SetProcessWorkingSetSize. İşte imza:
Tanım olarak, SetProcessWorkingSetSize işlevi belirtilen işlem için minimum ve maksimum çalışma kümesi boyutlarını ayarlar.
Bu API, işlemin bellek kullanım alanı için minimum ve maksimum bellek sınırlarının düşük düzeyde ayarlanmasına izin vermeyi amaçlamaktadır. Bununla birlikte, içinde en şanslı olan küçük bir tuhaflık var.
Hem minimum hem de maksimum değerler $ FFFFFFFF olarak ayarlanmışsa, API ayarlanan boyutu geçici olarak 0'a kırparak bellekten çıkarır ve hemen RAM'e geri döner, kendisine ayrılan minimum bellek miktarına sahip olacaktır (tüm bunlar birkaç nanosaniye içinde gerçekleşir, bu yüzden kullanıcı için fark edilemez).
Bu API'ya yalnızca belirli aralıklarla çağrı yapılır - sürekli değil, bu nedenle performans üzerinde hiçbir etkisi olmamalıdır.
Şimdi, periyodik olarak “Şimdi” ye karşı son tik sayısını kontrol edin ve ikisi arasındaki fark güvenli bir boşta kalma süresi olarak kabul edilen süreden büyükse, belleği kesin.
Şimdi programın hangi süreden sonra boşta kalacağına karar verin. Benim durumumda iki dakika karar verdik, ancak koşullara bağlı olarak istediğiniz herhangi bir dönemi seçebilirsiniz.
Bu yöntemi uzun işlem sürelerine veya toplu işlemlere uyarlamak oldukça basittir. Normalde, uzun bir sürecin nerede başlayacağı (örneğin milyonlarca veritabanı kaydından bir döngü okumasının başlangıcı) ve nerede biteceği (veritabanı okuma döngüsünün sonu) konusunda iyi bir fikriniz olacaktır.
Sürecin başlangıcında zamanlayıcıyı devre dışı bırakmanız ve işlemin sonunda tekrar etkinleştirmeniz yeterlidir.