Frage

Was ist das Beste E / A-Ereignis-Benachrichtigungsfunktion Windows-?

Mit dem besten meine ich etwas, das ...

  1. keine Begrenzung der Anzahl der Eingabedatei Deskriptoren haben
  2. funktioniert auf allen Datei-Deskriptoren (Festplattendateien, Steckdosen, ...)
  3. bietet verschiedene Benachrichtigungsarten (flankengetriggert, Grenze ausgelöst)
War es hilfreich?

Lösung

Unter Windows werden asynchrone Operationen, die durch Dateioperation erfolgt, nicht durch Descriptor. Es gibt mehrere Möglichkeiten, um auf Dateioperationen warten asynchron zu beenden.

Zum Beispiel, wenn Sie wissen wollen, wenn Daten auf einem Netzwerk-Socket verfügbar sind, geben Sie eine Asynchron-Leseanforderung auf dem Sockel, und wenn es abgeschlossen ist, die Daten zur Verfügung und wurde abgerufen.

In Win32 asynchrone Operation verwendet das OVERLAPPED Struktur Zustand über einen hervorragenden IO-Betrieb enthalten.

  1. Verknüpfen Sie die Dateien mit einem IO Completion-Port und Versand async IO-Anforderungen. Wenn eine Operation abgeschlossen ist, wird es eine Abschlussnachricht in die Warteschlange gestellt, die Ihr Arbeitsthread (n) auf warten und abrufen können, wie sie ankommen. Sie können auch benutzerdefinierte Nachrichten in die Warteschlange gestellt. Es gibt kein Limit, wie viele Dateien oder Nachrichten in der Warteschlange kann mit einem Completion-Port verwendet werden
  2. Der Versand jeder IO-Betrieb mit einem Ereignis. Die Veranstaltung mit einer Operation verbunden ist, wird signalisiert werden (erfüllt eine Wartezeit), wenn es abgeschlossen ist. Verwenden Sie WaitForMultipleObjects warten auf alle Ereignisse an Einmal. Dies hat den Nachteil, daß nur in der Lage zu sein auf einmal auf MAXIMUM_WAIT_OBJECTS Objekte zu warten (64). Sie können auch zur gleichen Zeit (Prozess / Thread Kündigung mutexes, Ereignisse, Semaphore)
  3. auf andere Arten von Veranstaltungen warten
  4. Verwenden Sie einen Thread-Pool . Der Thread-Pool kann eine unbegrenzte Anzahl von Objekten und Dateioperationen übernehmen, zu warten und ein belegbare Funktions nach Abschluss jeder.
  5. Verwenden Sie ReadFileEx und WriteFileEx Warteschlange Asynchronous Procedure Calls (APCs) an den aufruf Gewinde und SleepEx (oder WaitFor{Single|Multiple}ObjectsEx) mit Alertable TRUE eine Benachrichtigung für jede Operation zu erhalten, wenn es abgeschlossen ist. Dieses Verfahren ist ähnlich zu einem IO-Completion-Port, funktioniert aber nur für einen Thread.

Der Windows NT-Kernel macht keinen Unterschied zwischen Sockel, Plattendatei, Rohr usw. Dateioperationen intern: alle diese Optionen mit allen Dateitypen funktionieren

.

Andere Tipps

libuv

libuv bietet evented I / O für Unix und Windows und hat die Unterstützung für Sockel, Dateien und Rohre. Es ist die Plattformschicht von Node.js.

Weitere Informationen finden Sie unter: http://nikhilm.github.io/uvbook/introduction.html

Es gibt nicht einen noch, soweit ich weiß. Ein Freund und ich arbeite an einem Open-Source-Windows-epoll Implementierung (Link unten), aber wir laufen in Probleme, herauszufinden, wie sie das gleiche wie die Linux-Implementierung machen handeln.

Aktuelle Hindernisse:

  • In Linux, Filedeskriptoren und Socket-Deskriptoren sind austauschbar, aber in Windows sind sie nicht. Beide müssen mit einer epoll Implementierung kompatibel sein.
  • In Windows ist es ziemlich schwierig Kernel Ereignisse zu bekommen ... das ist, wie epoll Werke in Linux. Wir raten, dass ein Programm unserer plattformübergreifende epoll Bibliothek wird unter Windows als Linux deutlich langsamer laufen.

Ich werde versuchen, zurück und aktualisieren Sie diesen Beitrag kommen, wie wir Fortschritte mit dem Projekt zu machen.

http://sourceforge.net/projects/cpoll

select () Funktion ist POSIX und verwendbar an Fenstern einschließlich "winsock.h" oder "winsock2.h".

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