[so] [Tema5][Windows] ReadFile + WSAOVERLAPPED
Dorin Geman
dorin.geman at rosedu.org
Fri May 15 16:44:17 EEST 2020
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/ae64af05/attachment.html>
More information about the so
mailing list