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

Paul Olaru olarupaulstelian97 at gmail.com
Fri May 15 16:59:25 EEST 2020


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/5486c892/attachment-0001.html>


More information about the so mailing list