Ko pišete dolgotrajne aplikacije - vrste programov, ki bodo večino dneva porabili čim manj na opravilno vrstico oz sistemski pladenj, lahko postane pomembno, da program ne bo pustil bežati z uporabo pomnilnika.
Dva skrajna desna stolpca prikazujeta porabo CPU (časa) in porabo pomnilnika. Če postopek močno vpliva na katerega koli od teh, se bo vaš sistem upočasnil.
Vrsta, ki pogosto vpliva na uporabo CPU-ja, je program, ki se zanka (vprašajte katerega koli programerja, ki je pozabil vstaviti izjavo "preberi naslednji" v zanko obdelave datotek). Takšne težave se ponavadi zlahka odpravijo.
Po drugi strani uporaba pomnilnika ni vedno navidezna in jo je treba upravljati več kot popraviti. Vzemimo za primer, da se izvaja program vrste zajema.
Ta program se uporablja ves dan, po možnosti za telefoniranje na telefonski pisarni ali iz drugih razlogov. Samo nima smisla, da ga vsakih dvajset minut zaprete in nato znova zaženete. Uporabljala se bo čez dan, čeprav v redkih intervalih.
Če se ta program opira na kakšno težko notranjo obdelavo ali ima na svojih obrazcih veliko umetniških del, prej ali slej postane njegov
poraba pomnilnika bo naraščala, pustila bo manj pomnilnika za druge pogostejše procese, spodbudila pozivno aktivnost in na koncu upočasnila računalnik.Recimo, da boste zasnovali program z glavnim obrazcem in dvema dodatnima (modalnima) obrazcema. Običajno bo Delphi odvisno od vaše različice Delphi vstavil obrazce v projektna enota (Datoteka DPR) in bo vseboval vrstico za ustvarjanje vseh obrazcev ob zagonu aplikacije (Application. Ustvari formo (...)
Črte, ki so vključene v projektno enoto, je oblikoval Delphi in so odlične za ljudi, ki Delphi ne poznajo ali pa ga šele začenjajo uporabljati. To je priročno in koristno. Pomeni tudi, da se VSE obrazci ustvarijo ob zagonu programa in NE, ko jih potrebujejo.
Glede na to, za kaj gre v projektu in od funkcionalnosti, v katero ste izvedli obrazec, se lahko porabi veliko pomnilnika obrazce (ali na splošno: predmete) je treba ustvariti le, kadar jih potrebujemo, in jih uničiti (osvoboditi) takoj, ko jih ni več potrebno.
Oba, "DialogForm" in "OccasionalForm", je treba odstraniti s seznama "Samodejno ustvari obrazce" in premakniti na seznam "Razpoložljivi obrazci".
Upoštevajte, da tukaj opisana strategija temelji na predpostavki, da je zadevni program v trenutnem programu "zajemanje". Vendar se lahko enostavno prilagodi za serijske procese.
Delphi je poskušal to zmanjšati in ima svojo arhitekturo upravljanja pomnilnika, ki uporablja veliko manjše bloke, vendar je to praktično neuporaben v okolju Windows, saj razporejanje pomnilnika na koncu ostane na operacijskem sistemu.
Ko je Windows procesu dodelil blok pomnilnika in ta postopek sprosti 99,9% pomnilnika, Windows bo še vedno zaznal, da je celoten blok v uporabi, tudi če je dejansko en bajt bloka rabljen. Dobra novica je, da Windows ponuja mehanizem za odpravo te težave. Lupina nam ponuja API, imenovan SetProcessWorkingSetSize. Tu je podpis:
Funkcija SetProcessWorkingSetSize po definiciji nastavi najmanjšo in največjo velikost delovnega niza za navedeni postopek.
Namen tega API-ja je omogočiti nastavitev najnižje in največje meje pomnilnika za porabo prostora v pomnilniku procesa. Vendar ima v njem vgrajeno malo čudnosti, ki je najbolj posrečena.
Če sta tako najmanjša kot največja vrednost nastavljena na $ FFFFFFFF, bo API začasno nastavil nastavljeno velikost na 0, jo zamenjal iz pomnilnika in takoj vrne se v RAM, mu bo dodeljena minimalna količina pomnilnika (vse to se zgodi v nekaj nanosekundah, tako da bi moral biti uporabnik neopazno).
Poklic tega API-ja bo opravljen le v določenih intervalih - ne neprekinjeno, tako da na delovanje ne bi smeli vplivati.
Zdaj občasno preverite število zadnjih klopov glede na "Zdaj" in če je razlika med obema večja od obdobja, ki se šteje za obdobje varnega mirovanja, obrežite pomnilnik.
Zdaj se odločite, po katerem obdobju boste program smatrali, da je nedejaven. V mojem primeru smo se odločili za dve minuti, vendar lahko glede na okoliščine izberete katerokoli želeno obdobje.
Prilagoditev te metode za dolge čase obdelave ali serijske procese je precej preprosta. Običajno boste imeli dobro idejo, kje se bo začel dolgotrajen postopek (npr. Začetek branja zanke v milijonih zapisov baze podatkov) in kje se bo končal (konec zanke za branje baze podatkov).
Na začetku postopka preprosto onemogočite časovnik in ga na koncu postopka ponovno omogočite.