Windows 에서 표준 입력 을 비 차단 방식 으로 읽 습 니 다.

20503 단어
다음으로 이동:http://blog.codingnow.com/2006/08/nbstdin.html
최근 에 작은 문제 가 발생 했 습 니 다. 게임 의 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 에 남 겨 두 세 요.)

좋은 웹페이지 즐겨찾기