Frage

Was passiert, wenn Sie WaitForSingleObject() auf einem Griff rufen Sie mit CreateFile() oder _get_osfhandle() erstellt haben?

Aus Gründen nicht wert zu erklären Ich möchte WaitForSingleObject() verwenden, um auf einem Griff zu warten, dass ich mit _get_osfhandle(fd) erstellt habe, wo fd von einem normalen Anruf kommt _open(). Ist das möglich?

Ich habe es in der Praxis erprobt und auf einigen Maschinen es wie erwartet funktioniert (Der Griff ist immer in dem signalisierten Zustand, weil Sie mehr Daten lesen können), und auf einigen Maschinen auf unbestimmte Zeit blockieren WaitForSingleObject() wenn Sie es zulassen.

Die MSDN-Seite für WaitForSingleObject() sagt, dass die einzigen Dinge unterstützt, die es Griffe sind „Benachrichtigungen ändern, Konsole-Eingang, Ereignisse, Speicherressourcenbenachrichtigungen, Mutex, Prozesse, Semaphore, Threads und wartbar Timer.“

Zusätzlich wäre es anders, wenn ich CreateFile() statt _get_osfhandle() auf einem CRT-Dateideskriptor verwendet?

War es hilfreich?

Lösung

Sie es nicht tun. Wie Sie sehen können, hat es sich das Verhalten nicht definiert.

Auch wenn das Verhalten definiert ist, ist es in einer solchen Art und Weise definiert als relativ nicht sinnvoll zu sein, es sei denn, Sie möchten keine zusätzlichen Code zu schreiben. Es wird signalisiert, wenn eine asynchrone E / A-Operation an diesem Griff vervollständigt, die aber keinen Tracking nicht verallgemeinern, die I / O-Operation abgeschlossen.

Warum versuchen Sie, auf einer Datei-Handle zu warten? Klar, dass die Absicht zählt, wenn Sie etwas tun, das nicht einmal gut genug unterstützt wird, nicht auf unbestimmte Zeit blockiert werden.

Andere Tipps

Ich fand die folgenden Links. Die Konsensus mir scheint, tut es nicht.

  

Das Warten auf einen Datei-Handle

     

Wenn eine I / O-Operation auf einem gestartet   asynchroner Handgriff, wobei der Griff geht   in einen nicht-signalisierten Zustand. Deshalb,   wenn sie im Rahmen eines gebrauchten   WaitForSingleObject oder   WaitForMultipleObjects Betrieb, die   Datei-Handle wird geworden signalisiert, wenn   die I / O-Operation abgeschlossen ist. Jedoch,   Microsoft schreckt dies aktiv   Technik; es verallgemeinert nicht, wenn   gibt es mehr als eine anstehende E / A   Betrieb; der Griff würde   wenn eine I / O-Operation signalisiert,   vollendet, fertiggestellt. Daher wird, obwohl dies   Technik machbar ist, ist es nicht   als am beste Praxis.

  

Verwenden ReadDirectoryChangesW in   überlappten Modus. WaitForSingleObject   kann auf das Ereignis warten in der   ÜBERLAPPVERBINDUNG Struktur.

     

Sie können auch die API verwenden   WaitForSingleObject () auf eine warten   Datei ändern, wenn Sie die folgende verwenden   Wechselmitteilungsfunktion:
  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

     

Eine interessante Anmerkung zu „Bösartigkeit“ von ReadDirectoryChangesW:
   http://blogs.msdn.com/ericgu/archive/2005 /10/07/478396.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top