2009-11-10 3 views
3

차단은 내가 select() 세트 표준 입력을하고 난 할 때마다 사용자 유형을 표준 입력에서 그것을 문자열을 먹고 싶어하고 를 입력 안타.은 ncurses와 표준 입력이

그러나 선택은 표준 입력을 트리거한다 아무것도 전혀 입력하기 전에 는, 드문 경우에, 치면 입력하고 사용하기 전에 반드시 숙지으로 준비. 이로 인해 내 프로그램이 getstr()에 걸리며 을 입력하고을 입력하십시오.

나는 nocbreak() 설정을 시도했는데 아무것도 입력하지 않으면 화면에 울리는 것을 제외하고는 정말 완벽합니다. 그리고 echo()을 설정해도 변경되지 않습니다.

나는 또한 timeout(0)을 사용해 보았지만 그 결과는 더 미쳐서 작동하지 않았습니다.

+0

그럼 기본적으로 나는 궁금하네요 하지만 select 만 사용하는 것만 큼 우아하지는 않습니다. 내가 생각할 수있는 유일한 다른 옵션은 모든 문자를 읽고 급진적 인 처리를 시도하는 것입니다. 이것은 심지어 더 복잡 할 수있는 것처럼 보입니다. – graw

답변

1

getch() 함수로 문자를 사용할 수 있는지 확인하십시오. no-delay 모드에서이 메서드를 사용하면 메서드가 차단되지 않습니다. 그런 다음 '\ n'이 발생할 때까지 문자를 먹어서 각 문자열을 결과 문자열에 추가해야합니다.

그리고 - 그리고 내가 사용하는 방법 -은 GNU readline 라이브러리를 사용하는 것입니다. non-blocking behavior에 대한 지원이 있지만 해당 섹션에 대한 문서는 그리 우수하지 않습니다.

여기에 포함 된 작은 예제를 사용할 수 있습니다. 그것은 선택 루프를 가지고 있으며, GNU의 readline 라이브러리를 사용

#include <stdio.h> 
#include <readline/readline.h> 
#include <readline/history.h> 
#include <stdlib.h> 
#include <stdbool.h> 

int quit = false; 

void rl_cb(char* line) 
{ 
    if (NULL==line) { 
     quit = true; 
     return; 
    } 

    if(strlen(line) > 0) add_history(line); 

    printf("You typed:\n%s\n", line); 
    free(line); 
} 

int main() 
{ 
    struct timeval to; 
    const char *prompt = "# "; 

    rl_callback_handler_install(prompt, (rl_vcpfunc_t*) &rl_cb); 

    to.tv_sec = 0; 
    to.tv_usec = 10000; 

    while(1){ 
     if (quit) break; 
     select(1, NULL, NULL, NULL, &to); 
     rl_callback_read_char(); 
    }; 
    rl_callback_handler_remove(); 

    return 0; 
} 

컴파일을 가진 : 나는 때문에 ncurses를의 현재 스레드를 사용해야하는 경우 내가 할 수 있기 때문에

gcc -Wall rl.c -lreadline 
+0

감사. readline 솔루션을 사용해 보았습니다. 멋지게 보이지만 동시에 curses를 사용할 때는 여전히 제대로 반영되지 않습니다. 아마 함께 사용한다는 의미는 아닙니다. getch()를 사용하고 라인의 내부 버퍼를 유지하기로 결정했습니다. 그것은 놀랍게도 쉽습니다. – graw

관련 문제