Domanda

Che cosa accade quando si chiama WaitForSingleObject() su un manico che hai creato con CreateFile() o _get_osfhandle()?

Per ragioni non vale la pena spiegare Vorrei utilizzare WaitForSingleObject() ad aspettare su una maniglia che ho creato con _get_osfhandle(fd), dove fd proviene da una normale chiamata a _open(). È possibile?

ho provato in pratica, e su alcune macchine funziona come previsto (la maniglia è sempre in stato segnalato perché è possibile leggere più dati da esso), e su alcune macchine WaitForSingleObject() possa bloccare a tempo indeterminato se lo lasciate.

La pagina di MSDN per WaitForSingleObject() dice che l'supportato solo le cose che le maniglie sono "cambiare le notifiche, console di input, eventi, notifiche risorse di memoria, mutex, i processi, i semafori, le discussioni e timer waitable."

Inoltre, sarebbe diverso se ho usato CreateFile() invece di _get_osfhandle() su un descrittore di file CRT?

È stato utile?

Soluzione

Non farlo. Come si può vedere, è non definito comportamento.

Anche quando il comportamento è definito, è definito in modo tale da essere relativamente non utile a meno che non ti piace la scrittura di codice aggiuntivo. Si è segnalata quando tutte le operazioni di I / O asincrono su quella maniglia completa, che non generalizzare al tracking che I / O operazione finito.

Perché stai cercando di aspettare un handle di file? Chiaramente l'intento conta quando si sta facendo qualcosa che non è nemmeno supportata abbastanza bene per non bloccare a tempo indeterminato.

Altri suggerimenti

Ho trovato i seguenti link. Il concensus mi sembra, non farlo.

  

In attesa di un handle di file

     

Quando un'operazione di I / O è avviato su un   maniglia asincrono, la maniglia va   in uno stato non-signal. Perciò,   quando usato nel contesto di un   WaitForSingleObject o   operazione WaitForMultipleObjects, il   handle di file diventerà segnalato quando   l'operazione di I / O completa. Però,   Microsoft scoraggia attivamente questo   tecnica; non generalizzare, se   esiste più di uno in attesa di I / O   funzionamento; la maniglia diventerebbe   segnalato se qualsiasi operazione di I / O   completato. Pertanto, anche se questo   tecnica è fattibile, non è   le migliori pratiche in considerazione.

  

Usa ReadDirectoryChangesW in   modalità sovrapposta. WaitForSingleObject   vedo l'ora sull'evento nel   struct OVERLAPPED.

     

È anche possibile utilizzare l'API   WaitForSingleObject () per attendere su un   modifica del file se si utilizza il seguente   funzione di notifica di modifica:
  FindFirstChangeNotification ()
   http: // MSDN. microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/findfirstchangenotification.asp    http: // MSDN. microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp

     

Una nota interessante sulla "cattiveria" di ReadDirectoryChangesW:
   http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top