Windows 에서 표준 입력 을 비 차단 방식 으로 읽 습 니 다.
최근 에 작은 문제 가 발생 했 습 니 다. 게임 의 client 는 개발 디 버 깅 단계 에서 콘 솔 의 입력 명령 을 받 아야 합 니 다.이 수 요 는 사실 항상 있 었 다. 단지 예전 에 자신 이 쓴 콘 솔 이 었 을 뿐 이 었 다. 그러면 오히려 통제 가 잘 되 었 다.윈도 표준 콘 솔 을 사용 한 것 도 처음 은 아니 지만 이 입력 문 제 는 제대로 해결 되 지 않 았 다.이번에 또 이 문제 에 부 딪 혀 서 좋 은 해결 방안 을 찾기 로 결정 했다.
표준 입력 의 C 함 수 를 읽 습 니 다. scanf, gets 등 은 모두 차단 방식 입 니 다.호출 되 자마자 프로그램 이 거기에 끼어 움 직 이지 않 았 다.처음에는 콘 솔 입력 이 표준 입력 파일 이 었 으 니 이 파일 을 비 차단 모드 로 수정 하면 된다 는 생각 이 었 다.구 글 은 windows 에 fcntl 이나 ioctl 같은 것 이 없 는 것 처럼 stdin 을 비 차단 모드 로 수정 할 수 있 습 니 다.다른 windows API 가 있 을 지 모 르 겠 습 니 다. 찾 아 볼 기운 이 없습니다.
못 생 긴 방법 은kbhit 검 측 키보드 입력, 이 방법 은 나의 심미관 에 부합 되 지 않 습 니 다.생각해 보 니 다른 스 레 드 를 열 어 시원 하 게 하 는 것 이 좋 겠 다.어차피 디 버 깅 용 이 므 로 자원 점용 과 효율 측면 에서 볼 때 그다지 아름 답지 않 지만, 우선 그럭저럭 괜 찮 을 수 있다.
다음 코드 작업 가능:)
#include <windows.h>
#include <process.h>
#include <stdio.h>
#define BUFFER_MAX 1024
char g_nbstdin_buffer[2][BUFFER_MAX];
HANDLE g_input[2];
HANDLE g_process[2];
DWORD WINAPI console_input(LPVOID lpParameter)
{
for (;;) {
int i;
for (i=0;i<2;i++) {
fgets(g_nbstdin_buffer[i],BUFFER_MAX,stdin);
SetEvent(g_input[i]);
WaitForSingleObject(g_process[i],INFINITE);
}
}
return 0;
}
void create_nbstdin()
{
int i;
DWORD tid;
CreateThread(NULL,1024,&console_input,0,0,&tid);
for (i=0;i<2;i++) {
g_input[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
g_process[i]=CreateEvent(NULL,FALSE,FALSE,NULL);
g_nbstdin_buffer[i][0]='\0';
}
}
const char* nbstdin()
{
DWORD n=WaitForMultipleObjects(2,g_input,FALSE,0);
if (n==WAIT_OBJECT_0 || n==WAIT_OBJECT_0+1) {
n=n-WAIT_OBJECT_0;
SetEvent(g_process[n]);
return g_nbstdin_buffer[n];
}
else {
return 0;
}
}
void main()
{
create_nbstdin();
for (;;) {
const char *line=nbstdin();
if (line) {
printf(">%s",line);
}
else {
Sleep(0);
}
}
}
이 프로그램 은 stdin 을 추가 스 레 드 로 읽 습 니 다. 저 는 nbstdin () 이라는 함 수 를 실 현 했 습 니 다. 그 역할 은 gets () 와 비슷 합 니 다.그러나 이 함 수 는 차단 되 지 않 습 니 다. 콘 솔 에 새로운 줄 입력 이 없 으 면 빈 지침 으로 돌아 갑 니 다.
이 프로그램 은 두 개의 입력 버퍼 탁구 로 전환 되 었 습 니 다. 이렇게 하면 nbstdin () 을 두 번 호출 하 는 사이 에 입력 버퍼 의 처리 가 읽 기 스 레 드 에 의 해 파괴 되 는 것 을 피 할 수 있 습 니 다.
프로그램 이 끝 났 을 때 만들어 진 이벤트 도 방출 되 지 않 았 고 읽 기 입력 의 하위 스 레 드 를 주동 적 으로 닫 지 않 았 습 니 다. 저 는 이렇게 하 는 것 이 더욱 간결 하 다 고 생각 합 니 다. 이 os 가 처리 하 는 일 은 os 에 남 겨 두 세 요.)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.