Glavni thread i dalje treba primati razne evente, mesage i sl. iscrtavati progress, biti u mogućnosti da se klikne na drugu formu ili sl. U međuvremenu se čeka povratna vrijednost, a kad se pojavi ovaj mi to signalizira i mogu raditi nešto dalje, ako se sve odulji ili sl. mogu ga i prekinuti itd...
Inače bi ga koristio po principu da mu pošaljem inicialnu vrijednost još u konstruktoru, ovaj odradi što treba i sinhronizacijom ili sl. okine neki svoj event koji je vezan na glavni thread tj. formu gdje pročitam vrijednost i vozi dalje. I to napravi različitim eventima za različite tipove rezultata.
No elegantnije bi mi bilo napraviti to kao što sam gore napisao.
O čemu se radi? radi se o fiskalizaciji u HR.
XML, digitalni potpis XML-a. dig. potpis stringa, sopa i sve ostalo radi bez problema. radio sam jednu varijantu koja komunicira datotekama po principu upit/odgovor (za stare clipper porgrame i sl.) i varijantu za noviji soft u Delphiju.
Smisao je da istodobno imam otvoreno nekoliko računa, svaki u svom tabsheetu. Na bilo koji račun mogu kliknuti na gumb ispisa tj. fiskalizacije i čekati par sekundi (tj. do nekog timeouta). Dok u međuvremenu čekam, recimo mogu se prebaciti na drugi račun i isto kliknuti paralelno i njegovu fiskalizaciju, u nekom trenutku mi ovaj prethodni račun recimo javi da je sve odradio, tj. krene na tiskanje računa, pa potom i onaj drugi... Ili se vratim na prethodni i ponovim ga, ili ako se slučajno vrti mimo svih timeouta (što je bar teoretski moguće uslijed ne znam kakve greške), mogu ga terminirati, suspendati...
Osim fiskalizacije računa radim još neke metode propisane u fiskalizaciji, i želim ih sve držati pod kapom iste klase bez polimorfizma i ostaloga, iako im se neki temeljni dijelovi klasa poklapaju i preklapaju.
Smislili su (brazilski sistem) fiskalizacije, on-line, soap-om i zato postoji moguće čekanje, neočekivani ispadi linije tijekom obrade, pucanje certifikata, i svašta nešto što se takvim online riješenjem vuče.
Recimo, trenutno imam nešto ovakovo no baš mi se i ne čini da radi u threadu i da radi kako spada:
Code:
function TFiskalProcesor.GetRacunZahtjev(const aRacunZahtjev: TRacunZahtjev): TRacunOdgovor;
begin
FillChar(fRacunZahtjev, SizeOf(fRacunZahtjev), 0); // praznim varijablu zahtjeva
ftipDokumenta := fdRacun;
fRacunZahtjev := aRacunZahtjev;
if aRacunZahtjev.Racun.BrRac.BrOznRac <> '' then
fREQFileName := aRacunZahtjev.Racun.BrRac.OznPosPr + '-' +
aRacunZahtjev.Racun.BrRac.OznNapUr + '-' +
aRacunZahtjev.Racun.BrRac.BrOznRac
else fREQFileName := TFiskalizacija.NewGuidAsString;
// Resume;
Execute; // ovdje ide prava, potpuna validacija, obrada, potpis, slanje, obrada rezultata, praćenje grešaka i sve ostalo
if ( fStatus = stKrajTransakcije) and (fTijekStatusa in [tsZavrseno,tsOdbaceno, tsGreska]) then
Result := fRacunOdgovor;
Odnosno, onaj nepravilni Execute; zamijenjen sa Resume; self.WaitFor; otprilike radi posao, no čini mi se da nije to - to.
Možda te samo nisam dobro razumio, idem detaljnije proučiti onaj link. Waitfor i ostali mi nisu od pretjerane koristi...
BTW, hvala, uvijek imaš dobre savjete i odgovore.
[Ovu poruku je menjao komplikator dana 19.11.2012. u 15:28 GMT+1]
God is real unless is declared as integer.