[ knelenk @ 01.09.2004. 09:59 ] @
Napravio sam klasu u VB.NET-u koja komunicira sa COM portom. Za te potrebe sam koristio 15-ak API funkcija. Smatram da sam ih sasvim normalno pozvao (poznajem C++). Sporni dio koda se izvrsava u posebnoj niti.

Desava se da se cijeli program samo zavrsi u sred rada, bez ikakve poruke, kao da sam ga sam ugasio. To se nije desavalo dok nijesam uveo pomenutu klasu. U pitanju je .NET Framework 1.1.

Pokusao sam da upisujem u log fajl kad je koja funkcija pozvana a kad gotova, medjutim, ni to nije pomoglo - log fajlovi su prekinuti u sred pisanja stringa.

Pretpostavljam da je u pitanju API, ali mi nije jasno kako se ne javlja Exception. Jos da pomenem da ta klasa nema nikakve veze sa glavnim programom, ona pokrece nit koja posmatra dogadjaje sa COM porta i upisuje ih u interni bafer. Iz glavnog programa, s vremena na vrijeme, procitam taj bafer.

Da li je neko imao slican problem?
[ dusans @ 01.09.2004. 10:19 ] @
Da li si vrsio sihronizaciju sa baferom, da ne citas i upisujes u isto vreme?
[ knelenk @ 01.09.2004. 10:57 ] @
Jesam, ali ne vidim da bi to mogao biti razlog za tiho gasenje aplikacije. Mozda grijesim. Hvala za interesovanje.
[ Dragi Tata @ 01.09.2004. 13:02 ] @
Citat:
knelenk: Sporni dio koda se izvrsava u posebnoj niti.

Desava se da se cijeli program samo zavrsi u sred rada, bez ikakve poruke, kao da sam ga sam ugasio.


Naravno, teško je bilo šta reći dok se ne vidi kod, ali mi iz opisa problema liči da je glavna nit završila posao i ugasila se. Npr, pozvao si return u funkciji Main(). Kako sinhronizuješ niti?
[ knelenk @ 01.09.2004. 13:15 ] @
Nigdje u programu eksplicitno ne izlazim iz glavne niti. Ni Return, ni End...

Sto se tice niti, ona je samostalna. Jedino sto sam morao sinhronizovati je taj interni bafer, i to dio koda kada mu dodjeljujem vrijednost i kada citam iz njega. Te djelove koda sam uokvirio naredbama (npr):
SyncLock Me
...
bafer &= GetTekst(NizBafer)...
...
End SuncLock

Za citanje bafera, koji je inace privatna promjenljiva, koristim metod koji ga uzima preko property-ja.

Dakle, pustim nit da osluskuje desavanja na COM portu, ona puni bafer, a ja iz glavnog programa samo ponekad uzmem taj bafer i analiziram ga.
[ Dragi Tata @ 01.09.2004. 14:03 ] @
Ne moraš eksplicitno da izađeš iz glavne niti. Dovoljno je da imaš neku grešku u sinhronizaciji, pa da glavna nit ne čeka sporednu da se završi, nego se funkcija Main jednostavno završi.
[ knelenk @ 02.09.2004. 09:18 ] @
Citat:
Dragi Tata: Ne moraš eksplicitno da izađeš iz glavne niti. Dovoljno je da imaš neku grešku u sinhronizaciji, pa da glavna nit ne čeka sporednu da se završi, nego se funkcija Main jednostavno završi.


A sta mislis, da li bi javio neki Exception? Da li je moguce da se nesto lose desi i program se bez ikakve najave ugasi?
[ dusans @ 02.09.2004. 09:42 ] @
Probaj da se nakacis na ThreadException application klase i u jednom i u drugom threadu... :)
[ havramm @ 02.09.2004. 09:56 ] @
Time bas i ne dobija nesto. Samo ce izvrsiti "override" (na neki nacin) default prozora za exception handling, tj. dobice samo razlicitu reprezentaciju onoga sto bi dobio i bez toga.

Jesi li probao da sinhonizaciju izvrsis sa nekom statickom promenljivom a ne sa this (iliti Me u VB-u), ja sam, recimo, tako resavo neke probleme.

Jos nesto, ukoliko ti se recimo dogodi neki exception unutar worker thread-a (WT), ukoliko nemas "hvatac" izuzetaka (try-catch blok), nit ce jednostavno prekinuti izvrsavanje ali ti neces dobiti nikakvu informaciju. Uokviri unutar WT-a sumnjivi deo koda sa try-catch blokom i daj neku signalizaciju (recimo MessageBox-om) ukoliko se desi nesto nepredvidjeno.
[ knelenk @ 02.09.2004. 13:27 ] @
Nista nijesam uspio uhvatiti Try...Catch blokovima.

Jos jednu stvar nijesam pomenuo. Povremeno mi se javlja greska:
--------------------------------------------------------------
An unhandled exception of type 'System.ExecutionEngineException' occurred in unknown module
--------------------------------------------------------------
[ Dragi Tata @ 02.09.2004. 13:42 ] @
Citat:
knelenk: 'System.ExecutionEngineException' occurred in unknown module


Ovo ume da se desi kad nisi sasvim dobro deklarisao pozive API funkcija.
[ knelenk @ 02.09.2004. 15:12 ] @
Provjerio sam pozive API-ja jos jednom. Mislim da su u redu. Probao sam da bacim probni exception u niti i da ga ne presretnem. Ipak me je obavijestio da postoji exception.
[ Dragi Tata @ 02.09.2004. 15:41 ] @
Možeš li da postupiš ovako:

Prepravi program da ne koristi API pozive (tj, definiši "prazne" pozive umesto njih) i vidi da li to radi lepo.

Ako radi, znači imaš problem sa API pozivima. Onda ubacuješ jedan po jedan API poziv nazad i vidiš kad program "crkne".

Ako ne radi, znači nije do API-ja