2010-04-12 3 views
1

Mon application utilise l'API de communication série Java. A la lecture des docs, la méthode inputstream.read() bloque s'il n'y a pas de données disponibles.Comment gérer le délai d'expiration lors de la lecture avec l'API Java Comm

J'ai essayé de définir un délai d'expiration sur l'objet serialport mais les méthodes isReceiveTimeoutEnabled() retournent false, indiquant que mon pilote ne prend pas en charge les délais d'attente de façon native.

Alors, quelle est la meilleure façon d'implémenter un délai de lecture vu ce qui précède?

Merci, Fred

Répondre

1

Si sa ne fonctionne pas pour vous jeter juste que inputstream dans un fil et mettre en œuvre votre temps. Si elle expire, appelez close() sur le flux pour débloquer et fermer ce thread

1

Vous aurez besoin de deux threads.

Un thread de surveillance surveille un thread de lecture et l'interrompt lorsqu'un délai d'attente est détecté.

Avoir le fil de lecture dire le fil de surveillance qu'il est sur le point de commencer à lire, et quand il a terminé une lecture. Le thread du chien de garde lance une temporisation lorsqu'une lecture commence et interrompt le fil de lecture quand il expire ou arrête d'écouter pendant un temps d'arrêt lorsque la lecture est terminée.

Relisez le threading Java si vous ne le connaissez pas. Il est facile d'avoir des bogues multi-threading.

0

Vous pouvez également utiliser un SerialPortEventListener en tant que rappel pour être averti des nouvelles données disponibles et appeler uniquement lorsqu'il y a quelque chose à faire.

final SerialPort serialPort = ...; 
final InputStream in = serialPort.getInputStream(); 
serialPortal.notifyOnDataAvailable(true); 
serialPort.addEventListener(new SerialPortEventListener() { 
    public void serialEvent(SerialPortEvent event) { 
     if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { 
      // read from InputSteam 
     } 
    } 
}); 
Questions connexes