[so] [Tema5][Windows] ReadFile + WSAOVERLAPPED

Paul Olaru olarupaulstelian97 at gmail.com
Fri May 15 17:29:10 EEST 2020


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.geman at 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 <olarupaulstelian97 at gmail.com>
> wrote:
>
>> Evenimentele sunt și ele distincte?
>>
>> On Fri, May 15, 2020, 16:44 Dorin Geman <dorin.geman at 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.geman at rosedu.org>
>>> wrote:
>>>
>>>> Awesome, mersi!
>>>>
>>>> On Fri, May 15, 2020 at 4:08 PM Paul Olaru <
>>>> olarupaulstelian97 at 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.geman at rosedu.org>
>>>>> *Sent: *Friday, May 15, 2020 3:53 PM
>>>>> *To: *Paul Olaru <olarupaulstelian97 at gmail.com>
>>>>> *Cc: *Sisteme de Operare <so at cursuri.cs.pub.ro>
>>>>> *Subject: *Re: [so] [Tema5][Windows] ReadFile + WSAOVERLAPPED
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> *From: *Dorin Geman via so <so at cursuri.cs.pub.ro>
>>>>> *Sent: *Friday, May 15, 2020 3:35 PM
>>>>> *To: *Sisteme de Operare <so at 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 <
>>>>> olarupaulstelian97 at 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
>>>>>
>>>>>
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20200515/5c2cc6cd/attachment-0001.html>


More information about the so mailing list