2014-01-09 5 views
7

ich dies auch auf die Squeak Anfänger Liste geschrieben - ich werde sicher keine Antworten gibt, um sicherzustellen, von hier :)Lesen Sie einen Filestream (Named Pipe) mit einem Timeout in Smalltalk

Ich bin mit Squeak 4.2 und die Arbeit am Smalltalk Ende einer Named Pipe-Verbindung, die mit einer Nachricht an den benannten Pipe-Server sendet:

msg := 'Here''s Johnny!!!!'. 
    pipe nextPutAll: msg; flush. 

Es sollte dann eine Bestätigung erhalten, die ein 32-Byte-MD5-Hash des empfangenen sein wird Nachricht (die die Smalltalk-App dann überprüfen kann). Es ist möglich, dass der Named Pipes-Server nicht mehr funktioniert oder anderweitig nicht in der Lage ist, die Anfrage zu bearbeiten. Daher möchte ich beim Lesen der Bestätigung eine Zeitüberschreitung einstellen. Ich habe versucht, mit diesem:

ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3) onTimeout: [ 'timeout'. ]. 

und dann den Pipe-Server künstlich angehalten, um den Code zu testen. Aber der Smalltalk-Thread blockiert auf dem Lesen und führt nicht weiter (auch nach dem Timeout), obwohl, wenn ich dann den Pipe-Server zum Senden der richtigen Antwort (z. B. nach einer Verzögerung von 5 Sekunden), der Wert von 'ack 'ist' Zeitüberschreitung '. Offensichtlich hat das Timeout das getan, was es tun sollte, aber es konnte den blockierenden Read auf der Pipe nicht "entsperren".

Gibt es eine Möglichkeit, dies auch mit einem blockierenden FileStream-Read zu erreichen? Ich würde es eher vermeiden, auf die Verfügbarkeit von 32 Charakteren zu warten, wenn es überhaupt möglich ist.

+0

Nur zur Info, ich habe nie eine befriedigende Antwort auf diese finden. Der Grund, warum ich eine Named Pipe verwendet habe, war, dass das Starten eines Socket-Servers Firewall-Warnungen auslösen würde. Ich fand jedoch heraus, dass das Binden des Socket-Servers an 127.0.0.1 (anstatt der Standard 0.0.0.0) die Warnungen nicht auslöst - zumindest auf der Windows-Plattform. Also, Problem, äh, vermieden. – dsl101

Antwort

Verwandte Themen