Pipe u non-blocking modu ??

Pipe u non-blocking modu ??

offline
  • reiser 
  • Novi MyCity građanin
  • Pridružio: 14 Avg 2005
  • Poruke: 5

Dakle treba da iskoristim pipe za prenos nekih podataka izmedju dva threada u programu. Do sada sam se susretao samo sa blocking pipe, koji zakoce program dok se klijent ne konektuje na njega. Sada mi treba pipe u non-blocking modu, znaci kad ga kreiram sa CreateNamedPipe(), da program nastavi dalji rad, a drugi thread u programu ce se konektovati nakon izvesnog vremena na taj pipe. Kako to izvesti ?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Kada kreiras pipe u parametar OpenMode dodaj i PIPE_NOWAIT. To ce ti otvoriti pipe i non-blocking modu.



offline
  • reiser 
  • Novi MyCity građanin
  • Pridružio: 14 Avg 2005
  • Poruke: 5

Da, to znam. Ali kad pokusam da zapisem neki podatak u taj pipe cbWritten parametar ima vrednost 0. Citao sam po MSDN i tamo kazu da treba da se koristi i OVERLAPPED struktura, whatever. Moze li neki primer ?

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Za takav pristup radis ovako nesto:

1. Kada kreiras pipe OpenMode mora da sadrzi FILE_FLAG_OVERLAPPED, a PipeMode PIPE_NOWAIT.

2. Kada upisujes i citas iz pipe koristi ReadFileEx i WriteFileEx. Prva tri parametra znas da koristis. Handle za fajl, buffer i kolicina podataka za upis ili citanje. Sledeci parametar je pointer na Overlapped promenljivu (POverlapped). Ta promenljiva bi trebala da postoji sve dok se ne zavrsi upis ili citanje pa je najbolje da pre poziva Read ili WriteFileEx napises nesto ovako
var   O: POverlapped; begin   New(O);   ReadFileEx(...); end;
Tako kreiraj promenljivu i Delphi je nece osloboditi kad bude izlazio iz funkcije ili procedure u kojoj pozivas ReadFileEx.
Poslednji parametar je procedura koja se poziva kada se upisivanje ili citanje zavrsi. Ova je ovakvog oblika
procedure ObavestenjeIO(dwErrorCode: LongWord;     dwNumberOfBytesTransfered: LongWord;     lpOverlapped: POverlapped);
Ona ce se pozvati kada se zavrsi upis ili ispis. Mozes koristiti hEvent polje Overlapped strukture da naznacis koja operacija je u pitanju. To je nesto kao Tag property kod VCL komponenti. Nemoj samo da zaboravis da u toj proceduri za obavestavanje pozoves
Dispose(lpOverlapped);
jer si pre poziva Read ili WriteFileEx kreirao tu promenljivu sa New(O).
To je to... nadam se da ti je sad jasnije Smile

offline
  • reiser 
  • Novi MyCity građanin
  • Pridružio: 14 Avg 2005
  • Poruke: 5

OK, hvala Smile

Ko je trenutno na forumu
 

Ukupno su 763 korisnika na forumu :: 35 registrovanih, 6 sakrivenih i 722 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: alexmiki, Bane san, Bogoslov, Brankoni, cikadeda, dekao, dragon986, Dukelander, goflja76, goxin, kaisarevic1, kovinacc, ljuba, manda87, Marko Marković, MB120mm, mercedesamg, Mercury, Mikulino, milenko crazy north, Mixelotti, Nekicoveculjak, pein, Recce, RJ, saputnik plavetnila, Sirius, stegonosa, Toni, vlvl, W123, zexoni, zillbg, ZoranB., |_MeD_|