Trebuie să folosești structuri OVERLAPPED diferite și evenimente diferite între ReadFile și cealaltă operație; structura de OVERLAPPED nu e intenționată pentru refolosire fără a se face o reinițializare.
Fără evenimente diferite programul poate deveni confuz. În primul rând, dacă un eveniment este setat deja și vine o a doua tentativă de a-l seta fără un clear intermediar, nu se va apela niciun handler pt că eventul s-a setat deja. Deci trebuie reconfigurat și eventul și trebuie practic să ai evenimente separate. Nu încerca să le refolosești. Nu ești chiar atât de limitat cu RAM-ul, nu suntem în anii '90. On Fri, May 15, 2020, 17:04 Dorin Geman <dorin.ge...@rosedu.org> wrote: > Da. > > TransmitFile + ReadFile se află în aceeași funcție și se apelează în > funcție de tipul fișierului. > Aceștia folosesc aceeași structură OVERLAPPED pentru a trece în următoarea > stare. > > Problema este că TransmitFile generează evenimentul necesar pentru a > trece în starea următoare, dar ReadFile nu. > > On Fri, May 15, 2020 at 4:59 PM Paul Olaru <olarupaulstelia...@gmail.com> > wrote: > >> Evenimentele sunt și ele distincte? >> >> On Fri, May 15, 2020, 16:44 Dorin Geman <dorin.ge...@rosedu.org> wrote: >> >>> Din păcate, aceeași problemă. >>> Am modificat ca ReadFile să folosească un OVERLAPPED diferit, însă nu >>> s-a schimbat nimic. >>> ReadFile întoarce FALSE și GetLastError() == ERROR_IO_PENDING și rămâne >>> agățat acolo, nu primesc eveniment pe structura OVERLAPPED dată ca >>> parametru. >>> >>> On Fri, May 15, 2020 at 4:21 PM Dorin Geman <dorin.ge...@rosedu.org> >>> wrote: >>> >>>> Awesome, mersi! >>>> >>>> On Fri, May 15, 2020 at 4:08 PM Paul Olaru < >>>> olarupaulstelia...@gmail.com> wrote: >>>> >>>>> Nu am un exemplu clar dar o chestie indirectă e următorul citat: >>>>> >>>>> >>>>> >>>>> A common mistake is to reuse an *OVERLAPPED* structure before the >>>>> previous asynchronous operation has been completed. You should use a >>>>> separate structure for each request. You should also create an event >>>>> object >>>>> for each thread that processes data. If you store the event handles in an >>>>> array, you could easily wait for all events to be signaled using the >>>>> WaitForMultipleObjects >>>>> <https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-waitformultipleobjects> >>>>> function. >>>>> >>>>> >>>>> >>>>> O structură OVERLAPPED e asociată unei singure cereri, iar cererea >>>>> trebuie să fie completă, să se termine, înainte de a putea reutiliza >>>>> structura. O structură OVERLAPPED poate asculta doar pentru un eveniment >>>>> și >>>>> apoi trebuie reconfigurată; dacă e reconfigurată înainte ca cererea >>>>> anterioară să se termine o să pierzi evenimentul din acea cerere >>>>> anterioară. >>>>> >>>>> >>>>> >>>>> Practic când refolosești un OVERLAPPED, cea mai recentă configurație e >>>>> cea care are efect, dar în timpul celei mai recente configurații trebuie >>>>> ca >>>>> toate câmpurile nefolosite să fie resetate. >>>>> >>>>> >>>>> >>>>> În handler-ul evenimentului unui OVERLAPPED, acel OVERLAPPED încă nu e >>>>> ok pentru reutilizare pentru că Win32 încă îl folosește tocmai pentru a-ți >>>>> triggerui evenimentul. Acel trigger este sincron. După ce ieși din handler >>>>> structura poate fi reutilizată. >>>>> >>>>> >>>>> >>>>> So. Folosește structuri OVERLAPPED/WSAOVERLAPPED (după cum ai spus >>>>> sunt compatibile deci folosești structura care are sens cu o anumită >>>>> operație) separate pentru operațiile I/O concurente, cu considerentul că >>>>> handlerul de completion face parte din operația de I/O. >>>>> >>>>> >>>>> >>>>> Păstrează un OVERLAPPED pentru fișier și altul pentru socket. Sigur, >>>>> între cereri poți să le refolosești just fine. >>>>> >>>>> >>>>> >>>>> Nu e nevoie de documentație ca să încerci acest fix și să observi că >>>>> merge. >>>>> >>>>> >>>>> >>>>> Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for >>>>> Windows 10 >>>>> >>>>> >>>>> >>>>> *From: *Dorin Geman <dorin.ge...@rosedu.org> >>>>> *Sent: *Friday, May 15, 2020 3:53 PM >>>>> *To: *Paul Olaru <olarupaulstelia...@gmail.com> >>>>> *Cc: *Sisteme de Operare <so@cursuri.cs.pub.ro> >>>>> *Subject: *Re: [so] [Tema5][Windows] ReadFile + WSAOVERLAPPED >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> *From: *Dorin Geman via so <so@cursuri.cs.pub.ro> >>>>> *Sent: *Friday, May 15, 2020 3:35 PM >>>>> *To: *Sisteme de Operare <so@cursuri.cs.pub.ro> >>>>> *Subject: *[so] [Tema5][Windows] ReadFile + WSAOVERLAPPED >>>>> >>>>> >>>>> >>>>> Salutare, >>>>> >>>>> >>>>> >>>>> Am o mică nelămurire. >>>>> >>>>> Am citit că structurile OVERLAPPED și WSAOVERLAPPED sunt compatibile, >>>>> deci pot folosi un WSAOVERLAPPED la ReadFile. Cu toate acestea, dacă în >>>>> funcția aferentă unui structuri ov apelez ReadFile cu parametru aceeași >>>>> structura ov, programul rămâne blocat pentru că nu mai primesc eveniment >>>>> pe >>>>> acea structură. >>>>> >>>>> Fișierul este deschis cu FILE_FLAG_OVERLAPPED. >>>>> >>>>> >>>>> >>>>> Mersi anticipat și o zi frumoasă, >>>>> >>>>> Dorin Geman >>>>> >>>>> >>>>> >>>>> On Fri, May 15, 2020 at 3:41 PM Paul Olaru < >>>>> olarupaulstelia...@gmail.com> wrote: >>>>> >>>>> Nu cred că e vorba de o problemă de compatibilitate între OVERLAPPED >>>>> și WSAOVERLAPPED, ci mai degrabă >>>>> >>>>> e o problemă de reutilizare. Structura OVERLAPPED e deja activă în >>>>> callback-ul aferent și nu e o idee bună să >>>>> >>>>> o refolosești când este deja activă – you’re going to cause confusion >>>>> if not worse. >>>>> >>>>> >>>>> >>>>> Folosește o structură OVERLAPPED separată. >>>>> >>>>> >>>>> >>>>> Sent from Mail <https://go.microsoft.com/fwlink/?LinkId=550986> for >>>>> Windows 10 >>>>> >>>>> >>>>> >>>>> Și totuși, la TransmitFile merge să folosesc aceeași structură și la >>>>> următorul eveniment să închid conexiunea. >>>>> >>>>> Can you provide some further reading? Related to >>>>> >>>>> ``` >>>>> >>>>> Structura OVERLAPPED e deja activă în callback-ul aferent și nu e o >>>>> idee bună să >>>>> >>>>> o refolosești când este deja activă – you’re going to cause confusion >>>>> if not worse. >>>>> >>>>> ``` >>>>> >>>>> >>>>> >>>>> Mersi fain, >>>>> >>>>> Dorin Geman >>>>> >>>>> >>>>> >>>>
_______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii