2016-03-24 4 views
4

ich bin (scheinbar) zufällig immer den Fehler:Boost-Asynchron-Lese-/Schreib nicht mit „Nicht genügend Systemressourcen, um den angeforderten Dienst auszuführen“

"Insufficient system resources exist to complete the requested service"

Bei Verwendung des boost::asio::async_read_until oder boost::asio::async_write mit einer seriellen Schnittstelle.

die serielle Schnittstelle Nachdem erklärt wie:

boost::asio::serial_port mSerialPort; 

diese Fehler Folgen, ich versuche zu

try 
{ 
    mSerialPort.cancel(); 
    mSerialPort.close(); 
} 
catch(boost::system::system_error error) 
{ 
    ; 
} 

Wo einer von ihnen (noch nicht sicher, welche) hängen und nie wieder, nicht einmal zu werfen eine Ausnahme.

Im Allgemeinen, was bedeutet dieser Fehler?

Ist jemand auf dieses Problem gestoßen? Irgendeine Richtung sollte ich genauer untersuchen?


EDIT:

Die serielle Schnittstelle in Frage verwendet einen USB-Emulator.

In Bezug auf diese other SO Question, speziell der Kommentar von Hans Passant, ist es möglich, dass dieser Fehler mit dem Gerätetreiber verknüpft ist? Ich verwende den gleichen Code mit einer anderen Hardwarekomponente und habe dieses Verhalten nie erhalten.


EDIT 2:

Wenn im Web für diese Fehlermeldung suchen, oft wird empfohlen, die ausgelagerten Poolspeicher zu erhöhen, wie hier beschrieben:

Microsoft Support Article

All Sinn In meinem Fall?

+0

Haben Sie versucht, eine Korrelation zwischen der Größe der Daten, die Sie übertragen möchten, und dem Auftreten des Fehlers herzustellen? –

+0

Die Größe der Daten ist immer die gleiche, es ist kleine Befehle und Antworten, die Größe ist etwa 4-10 Zeichen lang. – Smash

+0

Welche spezifischen Geräte und Gerätetreiber verwenden Sie, wenn dieses Problem auftritt? –

Antwort

0

Es ist eine lange, lange Zeit seit ich mit seriellen Ports unter Windows arbeitete, also nehmen Sie diese Antwort mit diesem Gedanken. Sehr historisch, in NT 4.0 Tagen, die meisten Treiber für serielle Schnittstelle, die von den offiziellen DDK-Richtlinien für NT-Kernel abgeschrieben wurden, konnten asynchrone E/A nicht richtig ausführen und würden von Zeit zu Zeit mit Ihrem genauen Fehler versagen und/oder abstürzen. Die Lösung bestand darin, immer nur synchrone I/O mit serieller I/O zu verwenden, die korrekt funktionierte. Wenn der Treiber für Ihre USB-basierte serielle Schnittstelle ursprünglich ausreichend alt ist, kann dieses Problem möglicherweise reproduziert werden.

Ich würde auch sicherstellen, dass Sie identische Design-Muster zu bekannten arbeiten verwenden. Versuchen Sie http://www.ridgesolutions.ie/index.php/2012/12/13/boost-c-read-from-serial-port-with-timeout-example/ für ein Beispiel. Ich hoffe, das hilft.

0

Der Fehler bedeutet normalerweise, dass der Hauptspeicher ausgelastet ist und das System beim Swap Speicher zuweist, bis die Festplatte voll ist. Abhängig davon, wie lange Ihr Programm läuft, kann es als Folge eines Speicherlecks auftreten.

In Ihrem Fall passiert jedoch etwas auf der Treiberebene. Sie sollten die Ereignisanzeige überprüfen, für den Fall, dass dort etwas gemeldet wird (unter der Annahme von Fenstern).

Konnten Sie irgendetwas von der seriellen Schnittstelle überhaupt zurückbekommen? Je nach Code wird das Lesen vom Port unbegrenzt blockiert, wenn nichts zurückgesendet wird.

Dinge versuchen:

  • Versuchen Sie ein Zeichen in einer Zeit
  • Async Lesen aufgrund Rückrufe kann kompliziert sein, Gewindeschneiden usw. synchron Versuchen.
  • Wurde das Gerät mit Ihrem Code über denselben Emulator verbunden?
  • Versuchen Sie, den Puffer zu erhöhen Sie in das Lesen sind
  • Überprüfen Sie das Protokoll das Gerät
  • Überprüfen Baudrate

Hier großen Schub/Asio Ressource (POSIX basiert aber die allgemeine Informationen anwendbar ist, ist mit an alle Plattformen): http://www.webalice.it/fede.tft/serial_port/serial_port.html

+0

Es gibt keine Speicherlecks in der Software, soweit ich sehen kann. Der von dem Prozess verwendete Speicher wird im Task-Manager nicht mit der Zeit aktualisiert. Die Kommunikation (TX/RX alle 100 ms) kann den ganzen Tag gut funktionieren, dann tritt der Fehler einmal auf. Nichts in der Windows-Ereignisanzeige. – Smash

+0

Okay, es läuft den ganzen Tag ohne Problem. Es könnte immer noch ein Problem mit dem VM-Seitenpool/der Größe sein. Sie könnten versuchen, den virtuellen Speicher zu erhöhen oder die verschiedenen Registrierungs-Hacks zu überprüfen, um dies zu optimieren. Wenn auf Ihrer Festplatte den ganzen Tag IO läuft, verhält sie sich wie ein Dateiserver, der optimiert werden kann. Versuchen Sie auch, Anti-Virus zu stoppen. – adon

Verwandte Themen