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 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 for Windows 10

 

From: Dorin Geman
Sent: Friday, May 15, 2020 3:53 PM
To: Paul Olaru
Cc: Sisteme de Operare
Subject: Re: [so] [Tema5][Windows] ReadFile + WSAOVERLAPPED

 

 

From: Dorin Geman via so
Sent: Friday, May 15, 2020 3:35 PM
To: Sisteme de Operare
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 for Windows 10

 

Și totuși, la TransmitFile merge 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

Raspunde prin e-mail lui