[ mark432 @ 05.11.2008. 10:46 ] @
Imam sledeci problem na racunarima bez Visual Studija:

Pri koriscenju CreateProcess funkcije desava se da se HANDLE ne vraca OS-u iako je CloseHandle pozvan. Da li se neko sretao sa slicnim problemom? CreateProcess pozivam ~nx1000 puta u toku izvrsavanja programa pa ovo predstavlja problem jer u jednom momentu OS nece da dozvoli programu da kreira novi process.

Napominjem jos jednom ovo se desava samo na racunarima koji nemaju VS instaliran.

Hvala unapred
[ kiklop74 @ 05.11.2008. 19:46 ] @
CreateProcess pokrece eksterni proces ali dalji zivot tog procesa ne zavisi od programa koji ga je kreirao niti od poziva CloseHandle.

Kako se kaze ovde:
http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx

Citat:
Closing a thread handle does not terminate the associated thread or remove the thread object. Closing a process handle does not terminate the associated process or remove the process object. To remove a thread object, you must terminate the thread, then close all handles to the thread.


Za eksplicitno zatvaranje aplikacije treba koristiti TerminateProcess mada se to ne preporucuje jer se time prakticno nasilno ubija aplikacija.

Ono sto treba uraditi je sledece:

Pokrenuti process sa CreateProcess i sacekati da se proces sam zatvori pa tek onda krenuti i kreiranje sledeceg ili ako treba pokrenuti vise stvari u isto vreme onda koristiti poseban thread za svaki proces.

[ mmix @ 05.11.2008. 20:12 ] @
njemu je problem sto mu se nagomilavaju alocirani handlovi iako su procesi mozda zavrseni. AKo je child process sam zavrsio posao te ne znacu automatsko zatvaranje proces handlova i ubijanje procesa (zapravo u memoriji ostaje "ljuska" procesa sa nula aktivnih threadova).

@mark432, jel zatvaras OBA handle-a sa CloseHandle(), i za process i za glavni thread? Moras da oslobodis oba handle-a iz PROCESS_INFORMATION strukture.




[ mark432 @ 05.11.2008. 20:26 ] @
Nisu bitni procesi koji su kreirani. Broj handle-ova raste za proces koji kreira ~nx1000 procesa (u rasponu od 24h), svaki put kad se proces kreira i ne opada. Jedini handle-ovi koji se stvaraju su oni koji se dobijaju od CreateProcess rutine u PROCESS_INFORMATION strukturi, isti se i zatvaraju sa CloseHandle i ne dolazi do greske pri njihovom zatvaranju. Takodje se proverava i da li je postavljen HANDLE_FLAG_PROTECT_FROM_CLOSE pre poziva CloseHandle.

Sustina je da taj kod radi ispravno (broj handle-ova ne raste) na racunaru sa instaliranim visual studiom, a ne radi na racunaru bez Visual studija (handle-ovi se nagomilavaju).

Ranije sam imao problem sa SideBySide assembly pa sam u manifest file stavio da koristim 8.0.50727.42 verzije. Moguce je da ovde lezi neki problem, nisam bas iskusan sa SideBySide verzijama i koje probleme one mogu da impliciraju.
[ kiklop74 @ 06.11.2008. 19:45 ] @
Da li problem nestane ako se koristi staticki linkovan RTL?
[ mark432 @ 06.11.2008. 20:03 ] @
Rezultat build-ovanja je DLL, a RTL se staticki linkuje.
[ kiklop74 @ 06.11.2008. 22:35 ] @
Ostaje jedino da se vidi sam kod

Ako bi napravio mikro dll samo sa tom funkcijom i neki exe koji to poziva i tako simulira datu situaciju bilo bi lepo da to prilozis sa izvornim kodom pa da pogledamo.


BTW takodje ne bi bilo lose reci i koji kompajler, verzija SP, koji OS itd.
[ mark432 @ 08.11.2008. 23:04 ] @
Predlog da napravim exe koji poziva moj dll je bio od velike pomoci. Hvala vam.

Greska nije bila u mom kodu, niti je povezana sa SideBySide assembly.