이 코드는 원하는 것을 할 수는 있지만 새로운 언어 기능을 사용하지 않으며 이식성이 없습니다.
events[0] = CreateEvent(NULL,FALSE,FALSE,NULL); // Obtain a Windows handle to use with a timer
events[1] = GetStdHandle(STD_INPUT_HANDLE); // Get a Windows handle to the keyboard input
// Create a timer object that will strobe an event every ten seconds
DemoTimer = timeSetEvent(10000,0,(LPTIMECALLBACK)events[0],NULL,TIME_PERIODIC|TIME_CALLBACK_EVENT_SET);
while (done == false)
{
// Wait for either the timer to expire or a key press event
dwResult = WaitForMultipleObjects(2,events,false,INFINITE);
if (dwResult == WAIT_FAILED)
{
dwResult = GetLastError();
done = true;
}
else
{
if (dwResult == WAIT_OBJECT_0) // WAIT_OBJECT_0 corresponds to the timer event
{
DoTimeoutEvent();
}
else
{
// Any other event will be a keypress
if (_kbhit() != 0) // Verify that a key was pressed so that we do not block when we query for a value
{
int val = _getch();
// At this point, we process the key value
}
}
}
}
getch()
에서 벗어날 수는 없습니다. 가장 좋은 방법은 STDIN 버퍼의 데이터를 확인하고 읽을 항목이있는 경우에만 전화하는 것입니다. 이 예제에서는 kbhit()
을 사용하지만 주기적으로 버퍼 활동을 확인하는 폴링 루프를 사용하는 대신 기본 스트림을 입력 스트림에 연결하고 작업을 기다립니다.
원샷 타이머로 두 번째 스레드를 사용하는 것도 가장 효율적인 방법은 아닙니다. 이 코드의 타이머는 Microsoft 특정 개체를 사용합니다. 10 초마다 발사되도록 코드가되어 있지만 확실히 변경할 수 있습니다.
아니요, 더 이상 사용해서는 안되는 어두운 시대의 오래된 기능입니다. 'STDIN'에'epoll'해야합니다. –
getch()를 사용하고 있습니다. 키의 ASCII 값을 검색합니다. 그것들도 똑같은가요? – user7327796
예 _standard input_ (또는 다른 파일 설명자)을 활동으로 폴링하고 그 안에 수신 된 데이터를 처리하는 데는 여러 가지 방법이 있습니다. 'getch()'도 그 중 하나이지만, 여러분이 발견 한 것처럼 극한의 제약이 있습니다. 그것은 표준이 아닙니다. DOS 함수 였고 ncurses가 그것을 재현했다. –