2012-03-13 2 views
0

장래에 5 초를 실행하는 타이머 스레드와 실행을 마칠 때까지 기다리는 루프가 있습니다. 그런 다음 사용자가 enter 키를 누르면 프로그램이 종료됩니다. 루프를 기다리는 동안 입력이 입력 버퍼에 받아 들여지고 프로그램을 끝내는데 사용되었다는 사실을 알게되었습니다. 이후의 모든 입력은에 으로 입력됩니다!개행을 포함한 입력 버퍼 지우기

입력을 포함하여 "입력을 끝내려면 누르기"전에 입력 한 모든 입력을 무시하고 싶습니다. C++로 작업 한 이후로 한동안이 작업을 수행하는 방법을 기억할 수 없습니다 (저는 SO와 Google을 검색했으며이 특정 질문에 대한 답을 찾을 수 없습니다). 여기에 내 예입니다

std::cout << "Timer test: wait 5 seconds\n"; 
boost::asio::io_service test_io; 
deadline_timer test_timer(test_io, posix_time::seconds(5)); 

int testInt = 0; 
auto asynctest = [&testInt](const boost::system::error_code&) { 
    std::cout << "Running asynctest()\n"; 
    testInt = 5; 
}; 

std::cout << "Starting asynchtest, which should output in 5 seconds\n"; 
test_timer.async_wait(boost::bind<void>(asynctest, boost::asio::placeholders::error)); 

while(testInt != 5) { 
    std::cout << ". "; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(200)); 
} 

// How do I clear all input from the input stream here so that if the user hit enter 
// during the timer countdown it will be cleared and user still must hit enter to 
// exit program? 

std::cout << "Press enter to exit\n"; 
std::cin.ignore(80, '\n'); 
return 1; 

adsf

답변

2

순수 C++ 수준에서이 작업을 수행 할 수있는 방법이 없습니다; OS 레벨까지 을 떨어 뜨리거나 저주 같은 제 3 자 라이브러리 (또는 어쩌면 일부 비동기 IO 라이브러리를 사용하면 비동기식으로 cin 을 읽을 수 있습니다).

+0

부스트의 일부 기능으로는이 작업을 수행 할 수 없습니까? 또한, 덧붙여 말하자면 저는 Visual C++로 작업하고 있습니다. 분명히 MS는 이것을 수행 할 수있는 기능을 제공합니다 (테스트되지 않았습니다 - http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2007-01/ 참조). msg00389.html).하지만이 코드는 생산 코드가 아니기 때문에 목적을 이길 수는 없지만 내가 얼마나 녹슬 었는지 확인하는 자체 테스트입니다. – taz

+0

@ taz 나는'boost :: asio'가 열린'istream'과 어떻게 상호 작용하는지 모른다. 원칙적으로 비동기 입력을 관심있는 스트림에 연결할 수 있다면 비 블로킹 (non-blocking) 읽기를 사용하여 스트림에있는 모든 것을 읽고 꺼낼 수 있습니다. 그러나 나는 아마'cin'과 함께 작동 시키려고하지 않을 것입니다. 비동기 읽기와'cin' 버퍼 사이의 상호 작용은 명시되지 않을 수 있습니다. –

+0

글쎄, 나는 표준이 지원하지 않는 것을 즉시 시도하기에 충분히 녹슨거야. 예비 연구 결과 여러분이 옳다는 것을 알 수 있으며 이것은'boost :: asio'와 함께 작동 할 수도 있습니다. 아마도 스레드가 필요할 것입니다. C++ iostreams는 IO를 차단하지 않습니다. 방금 ​​연습 중이므로 더 이상 테스트하지 않을 것입니다. 다행히도 누군가가 두통을 덜어주기를 바랍니다. 도와 주셔서 감사합니다. 추가 읽기 : http://www.gamedev.net/topic/538714-asynchronous-console-input/ http://bytes.com/topic/c/answers/841283-how-make-non-blocking -call-cin – taz