다중 스레드 ncurses 프로그램의 창 크기 조정

다중 스레드 ncurses 프로그램의 창 크기 조정

전반적인 질문은 간단합니다.

다중 스레드 ncurses 프로그램에서 창 크기를 적절하게 조정하는 방법은 무엇입니까?


자세한 내용은 여기를 참조하세요. 몇 가지 관련 질문을 읽었습니다(1,2,). 내가 이해한 바로는 기본적으로 창 크기 조정을 처리하는 두 가지 방법이 있습니다.

  1. endwinrefresh사용자 자신의 핸들러 에서 호출됩니다 SIGWINCH.

  2. ncurses 내장 SIGWINCH처리기 getcha를 활용 KEY_RESIZE하고 처리하세요.

나는 ncurses 구현을 테스트하여 KEY_RESIZE.

  1. 내장 SIGWINCH처리기를 사용하는 경우 어떤 스레드가 신호 처리기를 실행합니까? 그게 그렇게 중요한 건가? 이것을 통제할 수 있나요?

  2. 내장 SIGWINCH핸들러는 하나의 를 생성합니다 KEY_RESIZE. 그러나 아직 전달되지 않은 다른 키를 누르면 어떻게 될까요? KEY_RESIZE다음 호출에서 반환되는 키 가 보장됩니까 getch?

  3. KEY_RESIZE핸들러를 직접 작성하는 것보다 핸들링이 더 쉬워 보입니다 SIGWINCH. 하지만 UI가 응답하도록 키가 전달되자마자 어떻게 읽을 수 있습니까? 전달을 감지하기 위해 stdin을 선택하거나 폴링할 수 있나요? stdin에만 관련되고 stdin에는 관련되지 않은 내부 큐에 배치되고 있습니까 getch?

  4. 내 자신의 핸들러를 작성하는 경우 SIGWINCH내 신호 핸들러 코드가 ncurses를 중단하지 않도록(신호가 전달될 때 호출할 수 없는 함수를 호출하는 등) ncurses 컨텍스트에 대해 어떤 보장이 있습니까?

  5. ncurses 자체는 단일 스레드인가요, 아니면 다중 스레드인가요? SIGWINCH메인 스레드를 제외한 모든 스레드에서 신호를 차단하면 SIGWINCH메인 스레드(ncurses 라이브러리에 의해 생성된 내부 스레드는 아님)에서 신호 수신이 보장됩니까?

답변1

다음은 몇 가지 질문입니다. 간단히:

  • ncurses는 단일 스레드입니다.

  • 저주구성 가능(빌드 시) 재진입성을 개선하고 구조에 대한 뮤텍스 사용을 단순화하기 위한 일부 기능을 추가합니다. 하지만 대부분의 패키저에서는 이 기능을 사용하지 않습니다. 일부 ncurses 샘플 프로그램은 이 기능을 보여줍니다.

  • 대부분의 Curses 구현(예: 35년이 넘은 새 버전) wgetch에서는 비차단 방식이나 매우 짧은 시간 초과로 호출을 할 수 있습니다.

  • KEY_RESIZE특별대우를 받다(동일하게선입선출문자로 입력되며 영향을 받지 않습니다.keypad설정에 설명된 대로wgetch매뉴얼 페이지).

  • 스레드 애플리케이션에 대한 (기본!) 지원이 포함된 ncurses 구성을 사용하지 않는 한(그리고그것은제한 사항) 모든 ncurses 입력/출력은 단일 스레드에 있어야 합니다. 다른 스레드는 원하는 대로 수행할 수 있습니다.

  • ncurses는 신호 도착을 기록하기 위해 정적(지속적/전역) 변수를 사용합니다. 이는 핸들러를 설정한 스레드와 다른 스레드에 도착하는 신호의 잠재적인 문제를 잠재적으로 제거합니다. 하지만 제안대로여기, 버그를 발견할 수 있습니다.

관련 정보