Printanje v threadih

Vse v zvezi s tiskanjem, urejanjem izpisov in reporting komponentami.
Odgovori
odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Printanje v threadih

Odgovor Napisal/-a odisej » 02.02.2010 07:45:26

Naredil sem nek report generator, ki zna tiskat tudi v threadih. Potem imam test, kjer kreiram 10 threadov in vsak naredi print v pdf. Včasih FastMM javi memory leak, včasih pa ne. Javi pa takole:

A memory block has been leaked. The size is: 20

Stack trace of when this block was allocated (return addresses):
4031CE [sys\system.pas][System][@GetMem][2654]
450639 [Printers.pas][Printers][TPrinter.GetPrinters][806]
4AB411 [OpPrinter.pas][OpPrinter][TdsPrinter.Create][953]
60294D [dsReportN.pas][dsReportN][TdsrReport.Create][6100]
65FF5C [Unit1.pas][Unit1][TPrintThread.Execute][56]
4307A3 [common\Classes.pas][Classes][ThreadProc][9877]
405532 [sys\system.pas][System][ThreadWrapper][12110]
75CEECCB [BaseThreadInitThunk]
77BCD24D [RtlCreateUserProcess]

Kolikor znam sam brati tole, je leak v GetPrinters. Ali prav berem? In ko gledam GetPrinters, mi niti ena stvar ni očitna, ki bi tak leak povzročala. Pravim pa, FastMM javi to samo občasno, torej od 5ih poiskusov 1x. Ima kdo kakšno idejo?

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Printanje v threadih

Odgovor Napisal/-a Runner » 03.02.2010 20:38:50

Ko zapreš aplikacijo, ali so vsti threadi končali svoje delo? Ker če niso potem jasno dobiš memory leak, saj imaš v enem ali več treadih alocirane in nesproščene resource.

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

Printanje v threadih

Odgovor Napisal/-a odisej » 04.02.2010 09:46:08

Jest mislim da so, nisem pa 100%. Razmišljam zdej, kako bi to zvedu. Pred koncem execute sicer pokličem eno proceduro s synchronize, ki doda en item v list box. V listi so vsi itemi, tako da predvidevam, da so threadi končali. Razen, če nek thread še dalj časa drži kreiran?

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Printanje v threadih

Odgovor Napisal/-a Runner » 04.02.2010 11:57:29

Če imaš sproščanje resourcov v destruktorju threada je velika možnost da se ti aplikacija zapre prej, preden se konča execute vseh threadov.

Ponavadi je pametno pri zapiranju aplikacije počakati na res vse threade, recimo z WaitForSingeObject. Enostavno podaš noter thread handle. Seveda čakaj z nekim timeoutom. Če do takrat ne konča ga lahko ubiješ z TerminateThread. No v tem primeru ne boš priše do destruktorja jasno in boš tudi imel nepočiščene resource. Ampak če je vse prav zastavljeno do tega nikoli ne bo prišlo.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Printanje v threadih

Odgovor Napisal/-a Runner » 04.02.2010 11:58:53

Pa še nekaj moraš vedeti. Ker itak zapreš aplikacijo, se ves uporabjen pomnilnik vrne OS-u. Tako da je vseeno če česa ne sprostiš. Tu se gre bolj za programersko higieno. Vsaj jaz ne maram ničesa prepuščati drugim, če lahko za sabo počistim sam.

Odgovori