Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Borland6 Izlazak iz programa

[es] :: C/C++ programiranje :: Borland6 Izlazak iz programa

[ Pregleda: 1887 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tokajac

Član broj: 93240
Poruke: 123
89.216.113.*



+5 Profil

icon Borland6 Izlazak iz programa12.01.2008. u 11:10 - pre 198 meseci
Jel ima metoda koja 100% bezbedno (ako postoji ovaj pojam...) gasi aplikaciju?


Radim sa Firebird bazom, i iz file-a ucitavam .bmp u BitBtn. Prilikom izlaska mi se javljaju dve greske (po jedna -zavisno od scenarija testiranja)

Debugger Exception Notification:
1. 'Access violation at address 407FCD9C. Read of address 00D678AC'

Debugger Exception Notification:
2. 'Access violation at address 407FCD9C in module 'ibxpress60.bpl'. Read of address 00D69328'

Verujem da su poznate greske, ali mogu poslati screenshotove.


Uredno zatvorim obe transakcije(toliko ih koristim) + na izlazu josh pitam

Code:

   if(Transaction1->InTransaction) 
      Commit transaction

   if(Transaction2->InTransaction) 
      Commit transaction



Spomenuo sam .bmp-ove, jer mi se desavalo da kad obrisem ucitavanje .bmp-a ne bude greske (& obrnuto).
Za bitBtn-ove na izlazu odradim:

Code:

  bitBtn1->Glyph->FreeImage();
  bitBtn2->Glyph->FreeImage();



Iznova sam napravio sve forme tako da garantujem da nije problem u "ostavljanju prljavstine za sobom"


Isto je ponasanje i ukoliko napravim .exe nezavisan od Borland okruzenja.


za zatvaranje sam pokusavao sa:
Code:


   Close();
   exit(0); 
   exit(1); 
  



Dakle, aplikacija radi ceo posao kako treba i na izlazu mi izbaci jedan od 2 navedena prozora sa greskom.
Treba mi metoda za 'sigurnu smrt'! :)
 
Odgovor na temu

savkic
Igor Savkić

Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Borland6 Izlazak iz programa12.01.2008. u 16:08 - pre 198 meseci
Access Violation označava pristup procesa memoriji na koju nema pravo (nije je alocirao ili je oslobodio). Pokušaj da nađeš uzrok tog problema, npr pokušaj uništavanja komponente koja je već oslobođena i slično. Ako bug nije u tvom programu onda je moguće u samom VCL, što je manje verovatno ali pogledaj da li ima update za tvoj Builder.
Što se tiče izlaska iz programa, regularan način je zatvaranje glavne forme aplikacije, nasilan prekid možeš ostvariti sa Halt ili ExitProcess.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Borland6 Izlazak iz programa12.01.2008. u 17:00 - pre 198 meseci
Citat:

Dakle, aplikacija radi ceo posao kako treba i na izlazu [...]

Kod BCB-a se lako događa scenario koji si opisao, a rešenje je uglavnom banalno ali ga je teško otkriti. Uglavnom se radi o pristupu nekim objektima (memoriji) koji su već uništeni (nisu više validni) a ti ili program pokušavate nešto i dalje sa tom memorijom.

Prvo što treba da ustanoviš je koje forme u programu su ti AutoCreate a koje Available (Project > Options).

Da podsetim, Available se moraju kreirati sa new i unistiti sa delete (sem ako im nisi dodelio Parent ili Owner kao argument pa će destrukcija ići automatski). Ako ipak uništavanje vršiš sam sa delete, savetujem NULL-ovanje objekta nakon delete.

AutoCreate se kreiraju u Project1.cpp (Application->CreateForm(...)) a prikazuju sa Show() ili ShowModal(). Zatvaraju se sa Close(), a unistavaju automatski.

Dakle, za pocetak proveri da slucajno nema neka AutoCreate forma koju si kreirao sa new, ili Available a da si 'preterao' sa delete.

Svakako, ovakav kod:
Code:

if(Transaction1->InTransaction) 

... zameni sa:
Code:

if(Transaction1 && Transaction1->InTransaction)
// ili:
if ( Transaction1 )
{
   if (Transaction1->InTransaction)
   // ...
}

Kada ti upravljas unistavanjem (pomenuo sam već gore), nije lose NULL-ovanje:
Code:

delete Form2;
Form2=NULL;

... iako je ovo čudno, u BCB programima zna da reši mnoge probleme.

Dalje, na mestima gde se vrši neka destrukcija (destruktor, OnClose, ...) nije loše barem privremeno postaviti ovakav kod:
Code:

// ...
Destructed = false;
// ...
void TNekiForm::NekiDestruct()
{
   if ( Destructed )
      return;

   Destructed = true;

   if ( NekiObjekat )
      delete NekiObjekat;
   // ...
}

... i ustanoviš ima li poboljšanja.

Dalje, proveri da li ima promene ako inicijalizaciju premestiš u konsktruktor iz FormCreate i destrtuktor (ručno ga praviš) iz FormDestroy.

Puno je faktora u igri, ali uglavnom pomaže ono da podesiš kod da samo JEDNOM dozvoli prolaz kroz deo koda gde se nešto uništava.

P.S.

exit(); će ti napraviti više problema nego dobiti čak iako ti uspe da 'ne vidiš greške'. U BCB VCL programima izbegavaj exit().
 
Odgovor na temu

[es] :: C/C++ programiranje :: Borland6 Izlazak iz programa

[ Pregleda: 1887 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.