Ich lese viele Geräte im Netzwerk (mehr als 300) durch wiederholtes Ping ab.
Das Programm fragt die Geräte nacheinander ab, also ist es langsam. Ich möchte die Geschwindigkeit der Umfrage erhöhen.
Es gibt einige Möglichkeiten, dies in Delphi 7 zu tun:
Was ist schneller, einfacher? Bitte geben Sie einige Beispiele oder Links an.
Ich persönlich würde mit IOCP gehen. Ich verwende das sehr erfolgreich für die Transport-Implementierung in NexusDB.
Wenn Sie 300 Sende- / Empfangszyklen mit blockierenden Sockets und parallelen Threads durchführen möchten, benötigen Sie 300 Threads.
Wenn Sie bei IOCP die Sockets mit dem IOCP verknüpft haben, können Sie die 300 Sendevorgänge ausführen, und sie werden sofort zurückkehren, bevor der Vorgang abgeschlossen ist. Wenn die Operationen abgeschlossen sind, werden sogenannte Completion-Pakete in die IOCP eingereiht. Sie haben dann einen Pool von Threads, der auf dem IOCP wartet, und das OS weckt sie auf, wenn die Completion-Pakete eingehen. Als Reaktion auf abgeschlossene Sendeoperationen können Sie dann die Empfangsoperationen durchführen. Die Empfangsoperationen kehren auch sofort zurück und werden, sobald sie tatsächlich abgeschlossen sind, in die IOCP eingereiht.
Das Besondere an einem IOCP ist, dass er weiß, welche Threads zu ihm gehören und gerade Vervollständigungspakete verarbeiten. Und der IOCP weckt nur neue Threads, wenn die Gesamtzahl der aktiven Threads (nicht in einem Wartezustand im Kernelmodus) niedriger ist als die Parallelitätsnummer des IOCP (standardmäßig entspricht dies der Anzahl der auf dem Computer verfügbaren logischen Kerne). Wenn auf dem IOCP Threads auf Completion-Pakete warten (die noch nicht gestartet wurden, obwohl Completion-Pakete in die Warteschlange gestellt wurden, weil die Anzahl der aktiven Threads der Concurrancy-Nummer entsprach), ist dies der Moment, in dem gerade einer der Threads verarbeitet wird Ein Completion-Paket tritt aus irgendeinem Grund in einen Kernel-Modus-Wartezustand ein. Einer der wartenden Threads wird gestartet.
Threads, die zum IOCP zurückkehren, nehmen Fertigpackungen in der LIFO-Reihenfolge auf. Das heißt, wenn ein Thread zum IOCP zurückkehrt und noch Completion-Pakete warten, nimmt dieser Thread das nächste Completion-Paket direkt auf, anstatt in einen Wartezustand versetzt zu werden, und der Thread wartet auf den längsten Zeitpunkt des Aufwachens.
Unter optimalen Bedingungen haben Sie eine Anzahl von Threads, die der Anzahl gleichzeitig verfügbarer Cores entspricht (eine auf jedem Core), das nächste Completion-Package abholen, es verarbeiten, zum IOCP zurückkehren und direkt den nächsten abholen Komplettierungspaket, alles ohne jemals in einen Kernel-Modus-Wartezustand oder einen Thread-Kontext-Schalter eintreten zu müssen.
Wenn Sie stattdessen 300 Threads und blockierende Operationen ausführen würden, würden Sie nicht nur mindestens 300 MB Adressraum (für den reservierten Speicherplatz für die Stacks) verschwenden, sondern Sie hätten auch konstante Threadkontextwechsel, wenn ein Thread eine Wartezeit eingibt Zustand (Warten auf einen Sende- oder Empfangsabschluss) und der nächste Thread mit einem abgeschlossenen Sende- oder Empfangsaufwachen. - Thorsten Engler vor 12 Stunden
Der direkte ICMP-Zugriff wird in Windows nicht mehr unterstützt. Der direkte Zugriff auf das ICMP-Protokoll unter Windows wird gesteuert. Aufgrund der bösartigen Verwendung von Raw-Sockets im ICMP / Ping / Traceroute-Stil glaube ich, dass Sie bei einigen Windows-Versionen Windows-eigene API verwenden müssen. Insbesondere Windows XP, Vista und Windows 7 lassen Benutzerprogramme nicht auf rohe Sockets zugreifen.
Ich habe die in ICMP.dll enthaltene Konserzfunktion verwendet, was einige Delphi-Ping-Komponenten tun, aber ein Kommentar unten machte mich auf die Tatsache aufmerksam, dass dies als "Verwendung einer undokumentierten API-Schnittstelle" betrachtet wird.
Hier ist ein Beispiel für den Aufruf der Haupt-Delphi-Ping-Komponente:
%Vor%Ich glaube, dass die meisten modernen Ping-Komponentenimplementierungen auf einem ähnlichen Bit des Codes basieren werden, und ich habe es verwendet, um diese Ping-Operation in einem Hintergrund-Thread ohne irgendwelche Probleme auszuführen. (Demo-Programm in den Link unten enthalten).
Der vollständige Beispielquellcode für die ICMP.DLL-basierte Demo ist hier .
UPDATE Ein moderneres IPHLPAPI.DLL-Beispiel finden Sie unter About.com hier.
Hier ist ein Artikel von Delphi3000 , der zeigt, wie man mit IOCP einen Thread-Pool erstellt. Ich bin nicht der Autor dieses Codes, aber die Informationen des Autors sind im Quellcode enthalten.
Ich poste die Kommentare und den Code hier erneut:
%Vor%Jeder sollte jetzt was verstehen Ein Thread ist, die Prinzipien von Threads und so weiter. Für diejenigen in Not, die einfache Funktion eines Threads ist zu separate Verarbeitung von einem Thread zu ein anderes, um gleichzeitig zu erlauben und parallele Ausführung. Der Hauptgrundsatz von Threads ist genauso einfach, Speicher zugeordnet, auf die verwiesen wird Threads müssen gemarshallt werden, um sicherzustellen Sicherheit des Zugangs. Es gibt eine Nummer von anderen Prinzipien, aber das ist wirklich um den man sich kümmern muss.
Und weiter ..
Eine Thread-sichere Warteschlange erlaubt mehrere Threads zum Hinzufügen und Entfernen, Push und Pop Werte zu und von der Bei einem First on First off sicher anstehen Basis. Mit einem effizienten und gut geschriebene Warteschlange kann man sehr hoch haben nützliche Komponente in der Entwicklung Gewindeanwendungen, von helfen mit threadsicherem Protokollieren, zu asynchrone Verarbeitung von Anfragen.
Ein Thread-Pool ist einfach ein Thread oder ein Anzahl der Fäden, die am meisten sind häufig verwendet, um eine Warteschlange von zu verwalten Anfragen. Zum Beispiel ein Webserver die würde eine ununterbrochene Schlange von haben Anfragen müssen bearbeitet werden Thread-Pools zur Verwaltung der http Anforderungen oder ein COM + - oder DCOM-Server verwendet einen Thread-Pool, um den RPC zu verarbeiten Anfragen. Dies ist so, da ist es weniger Auswirkungen von der Verarbeitung von einem Anfrage an einen anderen, sagen Sie, wenn Sie 3 gelaufen sind Anfragen synchron und die erste Anfrage dauerte 1 Minute, um die Die zweiten beiden Anfragen würden nicht abgeschlossen werden für mindestens 1 Minute hinzufügen an der Spitze da eigene Zeit zu verarbeiten, und für Bei den meisten Kunden ist dies nicht der Fall akzeptabel.
So wie das geht ..
Beginnend mit der Warteschlange !!
Delphi bietet ein TQueue-Objekt welches verfügbar ist aber ist leider nicht threadsicher noch wirklich zu effizient, aber Leute sollte sich die Contnrs.pas-Datei anschauen sieh zu wie borland dort stapeln und schreiben Warteschlangen. Es gibt nur zwei Hauptpunkte Funktionen für eine Warteschlange benötigt, diese sind hinzufügen und entfernen / drücken und pop. Add / Push fügt einen Wert, Zeiger oder hinzu Objekt an das Ende einer Warteschlange. Und remove / pop wird entfernt und gibt das zurück erster Wert in der Warteschlange.
Sie können vom TQueue-Objekt ableiten und überschreiben Sie die geschützten Methoden und hinzufügen in kritischen Abschnitten, dies wird hol dir etwas von dem Weg, aber ich würde es tun möchte, dass meine Warteschlange auf neu wartet Anforderungen sind in der Warteschlange und legen Sie die fädeln Sie sich in einen Ruhezustand ein wartet auf neue Anfragen. Das könnte sein getan durch Hinzufügen von Mutexes oder Signalisierung Ereignisse, aber es gibt einen einfacheren Weg. Das windows api bietet eine IO-Vervollständigung Warteschlange, die uns mit Thread versorgt sicherer Zugriff auf eine Warteschlange und ein Zustand von Ruhe während des Wartens auf neue Anfrage in die Warteschlange.
Implementieren des Thread-Pools
Der Thread-Pool wird sehr sein einfach und wird x Anzahl von verwalten Gewünschte Threads und übergeben jede Warteschlange Anfrage an ein Ereignis zur Verfügung gestellt zu werden verarbeitet. Es ist selten nötig Implementieren Sie eine TThread-Klasse und Ihre Logik implementiert werden und gekapselt innerhalb des execute-Ereignisses der Klasse, also ein einfaches Die TSimpleThread-Klasse kann erstellt werden welches irgendeine Methode in irgendeinem durchführt Objekt im Kontext eines anderen Faden. Sobald die Leute das verstehen, alles, womit Sie sich beschäftigen müssen ist Speicher zugeordnet.
Hier ist, wie es implementiert wird.
TThreadQueue und TThreadPool Implementierung
%Vor%Wie Sie sehen können, ist es ziemlich gerade vorwärts, und damit kannst du Implementieren Sie sehr einfach jede Warteschlange von Anfragen über Threads und wirklich alle Art der Anforderung, die erfordert Threading kann mit diesen durchgeführt werden Objekt und sparen Sie viel Zeit und Anstrengung.
Sie können damit Anfragen in die Warteschlange stellen von einem Thread zu mehreren Threads, oder Warteschlangenanfragen von mehreren führt zu einem Thread, der das ist eine ganz schöne Lösung.
Hier sind einige Beispiele für die Verwendung dieser Objekte.
Sichere Protokollierung
Um mehrere zuzulassen Threads zum asynchronen Schreiben in a Protokolldatei.
Da dies in einer Datei protokolliert wird, wird es Verarbeiten Sie alle Anfragen zu einem einzigen Thread, aber Sie könnten reiche E-Mail tun Benachrichtigungen mit einem höheren Thread zählen oder besser noch verarbeiten Profiling mit dem, was vor sich geht oder Schritte in Ihrem Programm, die ich werde demonstrieren in einem anderen Artikel als dies man ist jetzt ziemlich lang.
Für jetzt werde ich dich damit verlassen, genießen..Hinterlasse einen Kommentar wenn es da ist alles, was Menschen feststecken.
Chris
Benötigen Sie eine Antwort von jeder Maschine im Netzwerk oder sind diese 300 Maschinen nur eine Teilmenge des größeren Netzwerks?
Wenn Sie eine Antwort von jedem Computer benötigen, können Sie eine Broadcast-Adresse verwenden oder Multicast-Adresse für Ihre Echo-Anfrage.
Bitte probieren Sie "chknodes" parallel ping für Linux aus, das einen einzigen Ping an alle Knoten Ihres Netzwerks sendet. Es wird auch DNS-Reverse-Lookup und HTTP-Antwort anfordern, wenn so angegeben. Es ist vollständig in bash geschrieben, d. H. Sie können es leicht überprüfen oder ändern Sie es an Ihre Bedürfnisse. Hier ist ein Ausdruck der Hilfe:
chknodes -h
chknodes ---- schneller paralleler Ping
chknodes [-l | --log] [-h | --help] [-H | --http] [-u | --uninstall] [-v | --version] [-V | - ausführlich]
-l | --log In Datei protokollieren -h | --help Zeigt diesen Hilfebildschirm an -H | --http Überprüfen Sie auch HTTP-Antwort -n | --namen Erhalte auch Hostnamen -u | --uninstall Entfernen Sie die Installation -v | --version Version anzeigen -V | --verbose Zeige jede IP-Adresse pinged
Sie müssen die Ausführung dafür ausführen (wie bei jedem sh / bash-Skript), um es auszuführen:
%Vor%Beim ersten Durchlauf, d. h.
%Vor%Es wird vorgeschlagen, sich selbst nach / usr / local / bin / chknodes zu installieren, nachdem Sie nur
gegeben haben %Vor%wird reichen. Sie können es hier finden:
Tags und Links delphi network-programming ping iocp polling