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

Dorin Geman dorin.geman at rosedu.org
Fri May 15 17:04:18 EEST 2020


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/aa416d80/attachment.html>


More information about the so mailing list