Aktív témák
-
HEBI
senior tag
Sziasztok!
A progimban van egy komolyabb méretű image, ami egy framen csücsül. Erre rajzolgatok. De egy idő után a progi azt mondja : Nincs elég erőforrás. Nem rajzolgatás közben mondja, hanem mielőtt újra létrehozom és megjelenítem a formot amin a frame van. Miután bezárom a formot mindig felszabítom a memóriát, mert sokat eszik.
Nincs benne semmi logika mikor és milyen helyzetben produkálja a hibát.
A legszebb az egészben, hogy nem segít rajta, ha kilépek a progiból, sőt még a delphiből is, amíg nem indítom újra a gépet addig nem hajlandó megjeleníteni a progim egyetlen imaget sem. Újraindítás után ugyanaz az image simán megjelenik egy darabig.
Hozzátartozik az igazsághoz, hogy a háttérben egy másik formon szintén van egy image.
Hol lehetne ezeken a szükős erőforrásokon állítani?
A memória nem fogy el, van 250 MB (fizikai) üres... :OA csiga nem lassú állat, csak nagy a súrlódása...
-
Ice Hawk
csendes tag
Sziasztok!
Lenne egy kis gondom. Thread-eket szeretnék használni. Ezzel nincs is semmi gondom addíg, amíg Win 9x-en, vagy NT-n dolgozom. De amint áttérek 2k-ra, vagy XP-re a programjaim rögtön lefagynak. Illetve attól függ, hogy hány Thread-et használok lefagynak, vagy csak iszonyatosan megnőnek a válaszidők.
A szinkronizációval lehet gond? Hova kell szinkronizálni?
De az a helyzet, hogy ha Delphi könyvjöz kapott CD-n lévő progival is játszok, azzal is ugyan ez a jelenség.
Please Help! -
Edem
senior tag
Hali,
Hogyan állítsam be a Delphi 6-ot, hogy működjön a Ctrl-C, Ctrl-V, Ctrl-X, és emellett a speciális karaktereket ( ][, }{ ) is lehessen használni?
EdemMindenki nyomjon még egy ENTERt! Jó nagyot!
-
Edem
senior tag
Ez a topik azért nagyon jó, mert senki sem olvassa. Lehetne belőle Secret Off Topic, amibe úgy offolhatnánk, hogy közben nem tűnne fel senkinek sem.
De ez valszín érdeklődés (és persze az olvasottság) hiánya miatt elmarad. :)Mindenki nyomjon még egy ENTERt! Jó nagyot!
-
TheVeryGuest
senior tag
Nincs valahol az IDE beállítások között valami Microsoft/Borland style kapcsoló?
Csak tapogatózom, már évek óta nem is láttam Delphi-t (akkor még a 4-es volt a legújabb :)).“Perfection is attained not when there is nothing more to add, but when there is nothing more to remove” Antoine de Saint-Exupéry
-
Edem
senior tag
válasz TheVeryGuest #13 üzenetére
Most úgy néz ki, hogy nincs más megoldás, át kell állítani.
Mindenki nyomjon még egy ENTERt! Jó nagyot!
-
Edem
senior tag
Hali,
Akkor álljon itt a megoldás:
1. Stop Delphi
2. Run Regedit
My Computer / HKEY_USERS /
/ S-1-5-21-1111581266-668016370-827027905-1000 /
/ Software /
/ Borland /
/ Delphi /
/ 6.0 /
/ Editor /
/ Options /
Itt hozzál létre egy új String Value-t. (Name:=NoCtrlAltKeys, Value:=1)
3. Start Delphi
4. Tools / Editor Options... / General / Editor SpeedSetting := Default;
5. OK, és már kész is. :)
EdemMindenki nyomjon még egy ENTERt! Jó nagyot!
-
Alan
aktív tag
...az eredeti felvetésre pedig valószínűleg az a válasz, hogy Windows 9x rendszert nem érdemes fejlesztésre használni, mert fixen rögzített benne bizonyos erőforrások (pl. ablakkezelők) maximális száma, függetlenül a memória méretétől. (És a Windows-nál szinte *minden* ablak: a gomb, a kép, a menü, a menüpont, az ikon, az eszközsor, a panel stb.) Ezért mindegy, mennyi RAM-ot vesz az ember, a Windows 9x úgyis beakaszt.
-
CsendPenge
őstag
Két lehetőséget tudok elképzelni.
1.
Szerintem a felszabadításnál lesz a hiba. Nem szabadítod fel az összes használt erőforrást, vagy nem megfelelően szabadítod fel. Itt gondolok arra, amikor egy olyan műveletet végzel, ami automatikusan foglal, viszont neked manuálisan kell felszabadítanod az erőforrást. (pl. FindFirst/FindClose )
2.
A másik lehetőség, hogy valami bug szívat. Persze nem feltétlenül ebbe a kategóriába tartozhat ez a gond. Valami olyasmira gondolok, mint amikor pl. külön szálat indítasz, asszem várakozó állapotban, és utána nem kerül futásra, hanem felszabadítod, (kinyírod) akkor az memóriaszivárgást okoz, mert valami leírót nem semmisít meg automatikusan a windows (és állítólag te sem tudod, persze /biztos? :D/ lehet, hogy csak én/te/ő vagyunk kevesek)
Bocsi, de konkrét megoldást nem tudok, de ez hátha segít.Remember the Linux, that's like a wigwam: no Windows, no Gates, just Apache inside. Two minutes of thinking can save hours of unnecessary work.
-
Alan
aktív tag
válasz CsendPenge #20 üzenetére
Igen, az 1. eset is könnyen elképzelhető. De még ha nincs is semmi hiba, a Windows 9x előbb-utóbb úgyis probléma lesz.
Ha viszont NT alapú rendszeren fejleszt a topicindító, akkor nagyon valószínű, hogy fején találtad a szöget. -
CsendPenge
őstag
-
Alan
aktív tag
válasz CsendPenge #24 üzenetére
Félreértesz. Csak a fejlesztőrendszerhez kell NT alapú operációs rendszer, a ''késztermék'' már utána elmegy bármin (persze ha memóriát szivárogtatnak a fejlesztők, akkor nyilván nem :))
A fejlesztéshez iszonyúan sok Windows resource kell általában, hiszen a fejlesztőrendszer betöltése után az éppen fejlesztett programhoz általában nyitva tart az ember legalább 20-25 ablakot, sokszor az összes formot, néha több nyelvű változatban, rajtuk az összes komponenssel, vezérlővel és kezelőszervvel... nem is beszélve arról, ha munka közben hibás verziók születnek, amik trutymót hagynak maguk után a memóriában (természetes velejárója a munkának).
Szóval programozás közben hamar elfogy az a pár ezer ablakkezelő Windows 9x alatt, erre gondoltam. -
Edem
senior tag
Hali,
Hogyan kell képernyőszéléhez tapadó ablakot csinálni? Olyat, mint a winamp is.
ThxMindenki nyomjon még egy ENTERt! Jó nagyot!
-
Edem
senior tag
off
MODERÁTOR? Gartula! :)
on
OK, köszönöm, megvan. Bár csúnya módon kikopiztam egy másik forrásból (kicsit gagyi, mert pl. a 20 nem mint konstans szerepel, de ezt már bárki megcsinálja).
type
TForm1 = class(TForm)
private
procedure WMWindowPosChanging(var Msg : TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
end;
procedure TForm1.WMWindowPosChanging(var Msg : TWMWindowPosChanging);
var
Desktop : TRect;
begin
Inherited;
if SystemParametersInfo(SPI_GETWORKAREA, 0, @Desktop, 0) <> True then
begin
Desktop.Left := 0;
Desktop.Top := 0;
Desktop.Right := GetSystemMetrics(SM_CXSCREEN);
Desktop.Bottom := GetSystemMetrics(SM_CYSCREEN);
end;
if (Msg.WindowPos.x >= Desktop.Left - 20) and
(Msg.WindowPos.x <= Desktop.Left + 20) then
begin
Msg.WindowPos.x := Desktop.Left;
end;
if (Msg.WindowPos.x + Width >= Desktop.Right - 20) and
(Msg.WindowPos.x + Width <= Desktop.Right + 20) then
begin
Msg.WindowPos.x := Desktop.Right - Width;
end;
if (Msg.WindowPos.y >= Desktop.Top - 20) and
(Msg.WindowPos.y <= Desktop.Top + 20) then
begin
Msg.WindowPos.y := Desktop.Top;
end;
if (Msg.WindowPos.y + Height >= Desktop.Bottom - 20) and
(Msg.WindowPos.y + Height <= Desktop.Bottom + 20) then
begin
Msg.WindowPos.y := Desktop.Bottom - Height;
end;
end;Mindenki nyomjon még egy ENTERt! Jó nagyot!
-
beeboy
addikt
ez pölö a tálca fölé teszi középre az ablakot - el lehet szórakázni a pozicíóval:
procedure TForm2.FormActivate(Sender: TObject);
begin
setwindowpos(handle,hwnd_topmost,
(screen.width div 2)-(width div 2),
(screen.height )-(height+28 ),0,0,swp_nosize);
end;Nem vagyok intelligens. Én AMDligens vagyok...
-
lao ce
aktív tag
kezdem azt hinni, hogy valamit alapvetoen nem ertek. ennyi ev utan.
1) elinditom a task managert, raallok a kis programomra
2) van egy gombom megnyomni, erre betoltodik egy bitmap a memoriaba filebol. (loadfromfile)
3) megno a memoria fogyasztas
4) eleresztem (probaltam .free-vel es freeandnil-lel is)
5) nezem a taskmanager... a nagy fenet eresztodik el, ott terpeszkedik a diszno
D5 es D6 kiprobalva. elgepeles ki van zarva.
ja, a legerdekesebb ez a resz:
finally
FreeAndNil(WorkBitmap);
//WorkBitmap.Free;
Application.ProcessMessages;
end;
ha beteszem ezt a sort application.ProcessMessages, akkor a memoria megnovekszik! no, ezt mar vegkepp nem ertem.
esetleg valaki elmagyarazna nekem hogy hogyan is lehet kitakaritani a memoriabol valamit? en azt hittem hogy evek ota rendesen csinalom... aztan tessek.nicht kompot
-
rdi
veterán
Na én se ma programoztam utóljára, lehet, hogy nem is értek hozzá, de a memória felszabadítása nem azt jelentené, hogy onnantól írhat rá bármelyik progi?
Vagyis a felszabadítással bennmarad a memóriaszemét??
Tehát ahhoz, hogy szabadnak lássék, kellene egy memóri resetelő program?Fej! Tor! Potroh!
-
Alan
aktív tag
Sajnos a Windows memóriakezelése jóval bonyolultabb annál, hogy alloc/release és rögtön visszanövekszik a szabad memória.
Röviden legyen elég annyi, hogy a Task Manager-ben sehol nem láthatod, hogy a Te programod konkrétan mekkora részt foglalt le a saját 2GB-os virtuális címteréből (mert Te erre lennél kíváncsi, itt szabadul fel a FreeAndNil(WorkBitmap) után a virtuális memória). Csak a program munkakészletét, azaz a neki adott fizikai memória méretét látod, amit viszont a Windows maga szabályoz.
Egyébként egyszerű ''memory leak debugging'' kiválóan megvalósítható úgy is, hogy a Delphi-t a -hm paraméterrel indítod, így a címsorban folyamatosan frissített memóriainformációk lesznek az éppen futtatott programodra is (persze csak ha F9-cel futtatod). -
Alan
aktív tag
Annyit egyébként még megtehetsz a Task Manager-ben is, hogy a Performance fülön a Commit Charge csoportban a Total mezőt figyeled, bár ez nem tökéletes, mert a teljes rendszerre vonatkozó aktuális virtuálismemória-foglalást írja ki (amiben nemcsak a Te programod változásai lesznek benne), de ha elég nagy blokkokat foglalsz és szabadítasz fel, akkor itt láthatod, hogy ''ugrál'' a memóriafoglalás, ha nem is pont annyival, amennyit Te foglalsz vagy felszabadítasz.
-
lao ce
aktív tag
koszonet a hm-ert, kiprobaltam, nem is tudtam rola, azt hiszem eletemben nem inditottam el a delphit parameterrel. kicsit fura nezni az ot es het jegyu szam valtozasat -ugy ertem vizualisan kicsit nehez kovetni, de majd megszokom.
Alan, nem tudsz nekem ajanlani valami helyet ahol ilyen van, vagy kodreszletet amivel ki lehetne irni mekkora memoriat is fogyaszt a programom? en valahogy azt hittem (arrol almodoztam) hogy van valahol egy api. de sehogyse hogy a szemem ele keruljon, szoval attol tartok ilyen nincs. neked van valami modszered / olvasmanyod / segedprogramod arra az esetre hogyha memory leakek utan nyomozol? (leszamitva a hm-et)
a bitmap olvasas utan megnovekszik a t/m altal mutatott memoria, aranyosan a beolvasott bitmappel, szoval novekedni azt tud. csak csokkenni nem. aztan mar higgadtabban atgondoltam, es rajottem hogy valami remlik errol -csak mikor errol olvastam akkor epp nem erdekelt-, hogy a windows a memoriat tenylegesen csak kesobb, ha szukseg van ra vagy valami, akkor szabaditja fel.
szoval, megprobaltam varni de semmi, mas alkalmazasok hasznalatanal valtozott az en prgom memoria foglalasa, de nem egeszen ertettem mikor es miert. vegul ugy nez ki, ha a minimalizalom a programomat es utana restore, akkor mindig es egyertelmuen megvaltozik (lecsokken) a taskmanagerben mutatott memoria hasznalat. vagyis nem a memoria hasznalat, hanem a memoria hasznalatra utalo szamok. :)nicht kompot
-
Alan
aktív tag
Van egy jó kis ingyenes szoftver, MemProof a neve, a [L]http://www.automatedqa.com/downloads/memproof.asp[/L] címről letöltheted. Nagyon szigorú, biztos megtalálod majd vele a szivárgást (debug infóval fordítsd a programot, különben nem tudja követni az erőforrásokat).
A másik részére elég hosszú a válasz, ugye nem haragszol meg, ha most éjjel nem pötyögök be sok ezer karaktert :) Igazad van egyébként, minimalizálásnál a Windows automatikusan nagymértékben lecsökkenti az adott program munkakészletét, feltételezve, hogy a minimalizált programmal nem fogsz interakciót kezdeményezni. Amikor pedig visszaveszed a programot normál méretre, nem kapja automatikusan vissza a korábbi mennyiségű memóriát, csak egy részét, ha szüksége van rá, ''visszafaultolja'' magának, tehát laphibákat fog okozni és ennek hatására kapja vissza a fizikai memóriát fokozatosan. Ha tényleg érdekel, szólj és akkor később leírom, miért meg hogy van mindez :) -
lao ce
aktív tag
koszonet hogy visszaneztel :)
memproof letoltve.
dehogy haragszok, orulok hogy legalabb van aki erti az ilyesmit, es raadasul erre kolbaszol. termeszetesen erdekel (esetleg mast is), viszont ha tenyleg hosszu, akkor nincs szivem ilyesmire kerni teged. ha ugy erzed egyszer, hogy tul borongos a delutan, es az ujjaid faznak... nos, akkor esetleg... de nem surgos, mert az eddigi segitseggel amit kaptam toled mar tul tudom magam tenni ezen a feltetelezett probleman.
nem tudom egyebkent milyen delphit hasznalsz, en most tettem fel a hatost: teljesen kihagytak a win32 api helpet belole, vagy csak az en standard verziomnak nem resze? az otosomben benne volt - igaz csak 95/98/nt, de azert jobb volt mint a semmi.nicht kompot
-
Alan
aktív tag
Lao ce, hát nekem is öröm, ha normális emberekkel társaloghatok, ráadásul egyre ritkábban adatik meg ez egy fórumon.
A Delphi telepítésénél meg lehet(ett) adni, hogy kéred-e a Win32 API súgóját, és ha kérted, akkor a Start -> (All) Programs -> Borland Delphi 6 -> Help -> MS SDK Help Files menüben találod az összes hozzá tartozó fájlt. Amire valószínűleg gondolsz, az a Win32 Programmer's Reference (win32.hlp), vigyázz, sok hasonló nevű van.
A délelőtt ma elég borongós, aludni nem sokat sikerült, úgy hogy minden feltétel adott egy jó kis Windows eszmefuttatáshoz :) ). -
lao ce
aktív tag
eloszor is nagyszeru iras, nagyon koszonom. vilagos es ertheto. minden elismeresem.
:)
- a foglalasnal a program egyertelmuen megmondja, mennyit akar maganak. ez nem tarolodik el valahol? hiszen ez az amit 'lefoglal', meg akkor is ha nem kapja meg.
- a woking set-et lehet latni a task managerben (a kozepso oldalon a processeknel)?
- working set ujra: ''Ennek a méretét a rendszer maga szabályozza'' ez azt jelenti hogy novelheti es csokkentheti is, mivel szabalyozni probalja a page faultok masodpercenkenti szamat, ugye?
az a helyzet, hogy kihuztam egy csomo kerdest, mert mire leirtam, rajottem hogy benne van az iromanydban a valasz.nicht kompot
-
Alan
aktív tag
Köszi, kedves tőled :)
A válaszok:
- te ezt tanitod valahol?
- Igen, de inkognitómat nem fedhetem fel csak úgy :)
- a woking set-et lehet latni a task managerben (a kozepso oldalon a processeknel)?
- Igen. Próbáld ki, hogy megnézed egy program munkakészletét, aztán leminimalizálod. Rögtön leugrik 1-2000 K-ra a munkakészlete, ha nem kevesebbre. Másik jópofa kísérlet: ha már úgyis Delphiben programozol, tölts be egy nagyobb projektet, fordítsd le, nyisd meg az összes formját, majd nézd meg a munkakészletet. Minimalizáld a Delphi-t. Nyiss meg egy csomó másik izmos programot (pl. Photoshop), működj bennük, hadd teljen a fizikai memória. Most pedig állítsd vissza a Delphi-t normál méretre. Két dolog történik: egyrészt a munkakészlete nem áll vissza teljesen (ezt már az eddigiek alapján is sejtettük), másrészt jó sokáig bevilágítja a szobát a merevlemez piros LED-je és szemmel láthatóan lassan rajzolódnak ki a Delphi ablakai. Miért? Mert közben a tevékenység hiánya miatt laphibákat sem nagyon generált, ezért a Windows fokozatosan elvette tőle majdnem az összes fizikai memóriát, így visszaállításkor a lapozófájlból jön vissza mind a 40-100 megabyte, amit addig elfoglalt.
- working set ujra: ''Ennek a méretét a rendszer maga szabályozza'' ez azt jelenti hogy novelheti es csokkentheti is, mivel szabalyozni probalja a page faultok masodpercenkenti szamat, ugye?
- Igen, pontosan így van. Azért van egy abszolút minimum, ami alá sosem viszi le, nehogy baj legyen, de ez csak pár száz KB. És természetesen van abszolút maximum is, a kettő között azonban elég nagy a Windows játéktere. -
lao ce
aktív tag
''Első lépésben megnézi, hogy van-e még a kívánt méretben szabad hely a progrma (folyamat) címterében, ha van, akkor bejegyez egy foglalást egy táblázatba (virtual address descriptor table), de semmi mást nem csinál, nulla fizikai memóriát ad és laptáblákat sem készít az új memóriaterülethez (ezt hívják allokációs fázisnak). Csak vár. Arra, hogy a program ténylegesen hozzá is férjen az adott területhez. ''
es
''memóriát akkor rendel hozzá, ha ténylegesen használatba is veszi a program a kért területet ''
biztos bena kerdes, de mit jelent pontosabban az, hogy a program tenylegesen hozzafer (hasznalatba veszi) az adott teruletet a gyakorlatban? mondjuk ha betoltok egy bazi nagy kepet (loadfromfile :) - a delphi ugyi megnyitja a fajlt streamkent, beolvassa aztan a streamet felszabaditja), akkor az mar hasznalatba vetel? akkor az en nagy bitmapem bent van vagy nincs bent? ha atszinezem egy pixelet pirosrol zoldre az mar hasznalata az egesz kepnek vagy ez is 4k-s blokkonkent ertendo es csak azt a kis reszt vettem hasznalatba? (nem kell a peldahoz ragaszkodni ha valaszolsz)
bizonyos almodozasaimban (programozasos - tudod, a 'ha lenne idom meg penzem' kezdetuek) szo van arrol hogy hatalmas true/high color kepet hasznalnek bizonyos nem kepi informaciok letarolasahoz.nicht kompot
Aktív témák
Állásajánlatok
Cég: Ozeki Kft
Város: Debrecen
Cég: Ozeki Kft
Város: Debrecen