System.in
에서 문자를 사용할 수있는 경우 우아한 방법으로 이벤트를 발생시킬 수 있습니까? 나는 InputStream.available()
이라는 투표를 피하고 싶습니다.stdin을 비동기 적으로 읽는 방법?
답변
사용할 수있을 때까지 읽음으로 블록하는 별도의 스레드를 만들어야합니다.
실제로 입력을 먹고 싶지 않은 경우 내부 버퍼로 래핑하고 버퍼로 읽은 다음 큰 소리로 외쳐야하며 입력을 요청하면 버퍼에서 데이터를 돌려 주어야합니다.
당신은 이런 식으로 해결할 수 :
강력한 답변, 감사합니다. –
확실히 ... 입력에서 차단 된 스레드를 시작한 다음 무언가를 얻으면 이벤트 메서드를 호출합니다.
new Thread(){
public void run() {
while(System.in.get()){
}
}.start();
매우 일반적으로
InputStream stdin = System.in;
// Create a wrapper (with it's own dedicated read-thread)
MyListenableInputStream listenableInputStream =
new MyListenableInputStream(stdin);
// Update System.in with something more useful.
System.setIn(listenableInputStream);
: 이미 이벤트 반응기 실행이있는 경우
는 스레드를 생성하고 read()
에 차단할 수 있습니다. 사용 가능한 데이터가있을 때 해당 스레드가 처리 할 원자로에 대한 이벤트를 대기열에 넣도록하십시오. 이 작업을 수행 할 수없는 경우 대부분의 이벤트 리액터는 InvokeLater
또는 CallLater
메서드를 제공하므로 이벤트 처리 스레드에서 일부 코드를 실행할 수 있습니다.
함수 호출을 알리거나 예약 한 후에는 read()
에서 차단으로 돌아갑니다.
우아한 것을 원하면 Listener
을 허용하는 ObservableInputStream
을 쉽게 구현할 수 있지만 데이터 가용성에 대해 경고를 받으면 주기적으로 데이터를 확인하고 경우에 따라 수신기를 호출해야합니다.
작은 패킷을 보내는 개체로 스트림을 사용하지 않아도되지만 연속적인 바이트 스트림을 사용한다고 가정하면 입력 스트림에 지정된 데이터가 효과적으로 너무 자주 도착합니다 (그렇지 않으면 청취자를 자유롭게 부르는 것입니다). 또한 일관성에 대해 신경 써야합니다. 이미 데이터를 사용할 수 있고 리스너에게 경고 메시지가 표시되면 모든 바이트를 가져올 수 있습니다 (임시 버퍼에 저장해야 함). 방금 도착한 데이터가 더 많은 경우 처리 방법을 결정하십시오 (버퍼와 함께 제공하고 버퍼에 놓고 청취자를 다시 배치하는 등)
- 1. yii 명령에서 stdin을 읽는 방법
- 2. 파일 업로드를위한 javascript를 사용하여 파일을 비동기 적으로 읽는 방법
- 3. 비동기 적으로 이벤트 발생
- 4. dll을 비동기 적으로 호출하기
- 5. Windows 서비스에서 비동기 적으로 읽는 동안 Dispatcher.Invoke가 '멈춤'
- 6. ASP.net에서 비동기 적으로 WCF 호출 사용하지만 비동기 적으로 작동하지 않습니다.
- 7. 메서드를 비동기 적으로 호출
- 8. 비동기 적으로 복사 됨
- 9. JavaScript로 비동기 적으로 이미지로드
- 10. 이미지를 비동기 적으로 반환
- 11. HttpWebRequest (.NET)를 비동기 적으로 사용하는 방법?
- 12. 큰 이미지 NSURLConnection 비동기 적으로 업로드하는 방법?
- 13. 함수를 비동기 적으로 작성해야하는지 여부를 결정하는 방법
- 14. 비동기 적으로 SharePoint 프로필 이미지를로드하는 방법
- 15. log4j의 FileAppenders를 비동기 적으로 사용하는 방법?
- 16. WPF MessageBox.Show를 비동기 적으로 호출하십시오.
- 17. 이벤트 처리기가 비동기 적으로 처리됩니까?
- 18. 비동기 적으로 인터넷에서 정보 수집
- 19. Tee a Pipe 비동기 적으로
- 20. WebRequest.BeginGetResponse가 비동기 적으로 작동하지 않습니다.
- 21. 클릭 이벤트가 비동기 적으로 발생합니다
- 22. 코코아 스트림에서 비동기 적으로 쓰기
- 23. 왜 ReadDirectoryChangesW를 비동기 적으로 사용합니까?
- 24. ASP.NET 차트를 비동기 적으로 업데이트
- 25. subprocess.Popen에서 stdout을 비동기 적으로 읽습니다.
- 26. 업데이트 ASP.NET 패널은 비동기 적으로
- 27. 항목을 비동기 적으로 하나씩로드하는 ItemsControl
- 28. 비동기 적으로 발생하면 이벤트가 작동합니까?
- 29. 비동기 적으로 도메인 모델 로딩
- 30. WCF 비동기 적으로 구독자에게 알리기
System.in은 줄 바꿈 형식이므로 한 번에 하나의 키 입력을 읽을 수 없습니다. 인터페이스 응용 프로그램이 필요하면 GUI가 있어야합니다. –