Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

try ... except u theadu

[es] :: Pascal / Delphi / Kylix :: try ... except u theadu

[ Pregleda: 1646 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon try ... except u theadu13.01.2020. u 12:31 - pre 51 meseci
Delphi 2007

Imam problem sa tray - exept, ne izvrše se.
Program radi OK, osim samog kraja.
Program radi sa nekoliko tredova.
Kreirao sam osnovnu klasu thred-a u kojoj su mi zajedničke funkcije
Za svaki zasebni posao koji se vrti kreirao sam thread klasu koja je nasljednik osnovne klase.

U svakoj klasi pamtim koje sam objekte kreirao (qery, tlist, tstringlist). Smještam ih u Listu: tObjectList koja je definirana u osnovnom thread-u

U Osnovno thread-u sam kreirao proceduru koja radi free svih objekata i tu proceduru pozivam na kraju Execute procedure svakog thread-a ili pri greški (podaci, pristup FTP-u, pristup bazi...) unutar tread-a kada izlazim iz Execute procedure thread-a:

Code:

try
   ...
   tContToFree(fContToFree[i]).Kontrola.Free
   ...
except
   on e:exception do begin
      // pišem u log grešku
   end;
end;


fContToFree: tObjectList

tContToFree=class
Kontrola: tObject;
Name: string;
end;

Na retku: tContToFree(fContToFree).Kontrola.Free program stane, win javi grešku: "Program.exe has stopped working. A Problem caused the program to stop working correctly...."

Dakle, try...except ne odradi svoje

Pokušao sam i kreirato proceduru (u osnovnom thread-u) koja radi free pa umjesto: "tContToFree(fContToFree).Kontrola.Free" sam pokušao:
"Synhronize(FreeMyObj)". Rezulat je isti.

Ima li tko ideju o čemu se radi?
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: try ... except u theadu13.01.2020. u 12:47 - pre 51 meseci
Da li imas join svih threadova pre nego sto pocnes da oslobadjas objekte? Ukoliko ostali threadovi rade i pristupaju podacima naravno da ce da pukne.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu13.01.2020. u 13:13 - pre 51 meseci
Objekte koje oslobađam kreirao sam u tom thread-u u kom ih i oslobađam.
Iskušao sam samo sa jednim thread-om (ne računajući main), ista situacija.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: try ... except u theadu13.01.2020. u 13:18 - pre 51 meseci
Da li dobijas neku gresku C000...? Kako saljes podatke obrade u glavni thread? Moguce je da pristupas objektu koji se koristi ili je vec oslobodjen a moguce je da i greska bude u nekom sasvim drugom mestu (cak i glavnom threadu). Ukljuci use debug dcus i stavi breakpoint na taj red i vidi mozes li dobiti tacne detalje gde u RTL kodu puca.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu13.01.2020. u 13:42 - pre 51 meseci
Problem je što se program vrti na serveru stranke, sa svog kompa nemam pristu svim resursima.
Thread se vrti kao zaseban, ne razmjenjuje podatke s main-om ili ostalim thread-ovima.
Jedina zajednička točka je pisanje u text file (log), za što koristim synhronize i do sada nije bilo problema.

Nakon potvrde prve greške, win javi sljedeću: "Exception EInvaliPointer in module Program.exe at 000047c5. Invalid pointer operation"

To obično znači da nije kreiran objekt, u ovom sličaju sam siguran da je kreiran i da postoji jer se redak prije poziva.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: try ... except u theadu13.01.2020. u 14:00 - pre 51 meseci
Izbaci pisanje u log i vidi da li se opet desava. Greska i ne mora biti u tom threadu ili na tom mestu, verovatno na nekom mestu u kodu imas situaciju da oslobodis memoriju koju ne bi trebalo ili da prepises sadrzaj neke memorije. Ovi problemi se tesko nalaze, pokusaj sa nekim mem logerima, tipa FastMM4.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu13.01.2020. u 14:05 - pre 51 meseci
Pokušao sam ne izvršiti free objekata, tj. ne pozvati funkciju u kojoj se oslobađaju. Program završi OK, bez greške.
Možda mi je to rješenje za prvu ruku jer se svaki treb izvrši jednom ako nema greške, a ako se pojavi greška ponavlja se do 5 puta i nakon toga se program gasi.

Program sinhronizira podatke iz FB baze na lok. serveru sa podacima u MySQL-u na WEB-u.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu13.01.2020. u 14:51 - pre 51 meseci
Try ... except radi ispravno, moja greška, pokušao sam upisati nešto to nije definirano.

Ostaje i dalje pitanje zašto mi puca na free objekta i javi Access violation
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu13.01.2020. u 15:40 - pre 51 meseci
Pitanje:
kako znati da je objekt kreiran?

Assigned(Objekt) nije najsigurnije rješenje, tj. je ako se prije napravi:

Objekt.Free;
Objekt := Nil;

ili

FreeAndNil(Objekt)

Ako se napravi:
Objekt := tMyClass.Create;
Objekt.Free;

Assigned(Objekt) će vratiti true mada objekt ne postoji i npr Objekt.Propery1 će generirati grešku.

Postoji li rješenje?
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: try ... except u theadu13.01.2020. u 18:36 - pre 51 meseci
Citat:
FranjoZG:
Objekte koje oslobađam kreirao sam u tom thread-u u kom ih i oslobađam.
Iskušao sam samo sa jednim thread-om (ne računajući main), ista situacija.


Ako drugi threadovi ne pristupaju tim objektima onda je problem ne vezan za threadove.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu14.01.2020. u 12:35 - pre 51 meseci
Našao sam grešku, problem je bio u Destroy objekta koji mi je kao elemet liste... nema vese s thread-om.

Ostaje pitanje:
Kako u osvnovno thread-u (iz kog su izvedeni ostali) napraviti free objekata?

1. Objekti mogu biti različitog tipa: TIbQuery, TList, TStringList, korisnički definirani objekti...
2. Namjera je kreirati listu s popisom svih objekata koji se trebaju detroy-ati kod završetka posla. U Listu na početku upisati sve objekta i ne brinuti više o njihovom destroy-anju.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: try ... except u theadu14.01.2020. u 13:32 - pre 51 meseci
Deljene objekte ne smes unistiti sve dok i jedan thread koji im pristupa radi. Znaci moras da joinujes sa threadom cije objekte hoces da oslobodis, u threadu koji oslobadja.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: try ... except u theadu14.01.2020. u 13:37 - pre 51 meseci
> Pitanje: kako znati da je objekt kreiran?
> Assigned(Objekt) nije najsigurnije rješenje, tj. je ako se prije napravi:

To je uglavnom najcesci nacin da se vodi racuna o tome, kod mora voditi racuna da koristi FreeAndNil ako koristi nil kao flag.

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: try ... except u theadu14.01.2020. u 13:42 - pre 51 meseci
> 1. Objekti mogu biti različitog tipa: TIbQuery, TList, TStringList, korisnički definirani objekti...
> 2. Namjera je kreirati listu s popisom svih objekata koji se trebaju detroy-ati kod završetka posla. U Listu na
> početku upisati sve objekta i ne brinuti više o njihovom destroy-anju.

Delphi nema garbage collection tako da ti moras brinuti o tome, ako ne zelis da oslobadjas instance kad ti vise ne trebaju onda koristi neki TThreadList u koji ces dodati svaki objekat kad ti vise ne treba i onda povremeno samo prodji kroz tu listu i oslobodi objekte.

Po meni, ako vec kreiras objekte u threadu onda ih tu i trebas osloboditi. Napravi dve metode, InitObjects i ReleaseObjects, jednu pozivas iz Create (odnosno kad ti vec trebaju) a drugu u Destroy (odnosno kad ti vise ne trebaju).
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.adsl.net.t-com.hr.



+4 Profil

icon Re: try ... except u theadu14.01.2020. u 14:26 - pre 51 meseci
Rješio sam problem na klasičan način: radim free tamo gdje i create i sve je ok, ali mi izgleda zanimljiv problem za rješavanje.
Možda nisam dobro objasnio:

Imam:
Code:

   tThreadOsnovno=class(Thread)
     ...
   End;

   tThread1=class(tThreadOsnovno)
      ...
   end;


- thread ThreadOsnovno u kom su mi definicije zajedničkih funkcija, procedura, varijabli
- thread Thread1 koji je nasljednik ThreadOsnovno sa specifičnostima koje su mi potrebne

U programu radim sa Thread1 (ili koliko ih već ima), ne radim sa ThreadOsnovno, ne kreiram ga iz tThreadOsnovno.

U Thread1 kreiram objekte (User def, tList, tQuery...). Oslobađam ih (free) na kraju Execute procedure (Thread1).

Izlaz iz execute procedure može biti na nekoliko mjesta pa moram voditi računa kada je što kreirano da to i oslobodim.
Ono što pokušavam napraviti (čini mi se zanimljivo) je da ne brinem jesam li nešto oslobodio ili ne je sljedeće:

- u tThreadOsnovno kreiram:
1. proc. "AppendObject" gdje nakon kreiranja dodam objekt u listu
2. proc. "FreeObject" gdje oslobodim sve objekte koji su u listi
- u tThread1
1. nakon Obj1 := tObj1.Create napravim: AppendObject(Obj1)
2. prije exita iz Execute pozovem: FreeObject

Pokušao sam to, ali mi javlja grešku: Invalid pointer... kada free radim u Thread1 (Obj1.Free) sve je ok. Znači da nije problem u objektu.
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 252
91.232.237.*



+1 Profil

icon Re: try ... except u theadu14.01.2020. u 14:41 - pre 51 meseci
Taman da otkucam, a ti resio :)

Vidim da si koristio TObjectList, pa da nije mozda tu bio problem? On po defaultu kada se unistava, sam unistava i objekte koji su u njemu. Dakle ili obrisi kod koji ti rucno ubija komponente, ili pri kreiranju TObjectLista stavi AOwnsObjects na false, ili probaj sa obicnim TList umesto TObjectList.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: try ... except u theadu

[ Pregleda: 1646 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.