全体的な質問は簡単です。
マルチスレッドncursesプログラムでウィンドウサイズを適切に調整するには?
詳しくはこちらをご覧ください。いくつかの関連質問を読みました(1、2、サム)。私が理解したのは、基本的にウィンドウのサイズ変更を処理する2つの方法があります。
endwin
refresh
ユーザー自身のハンドラから呼び出されますSIGWINCH
。ncurses組み込み
SIGWINCH
ハンドラgetch
aを活用しKEY_RESIZE
て処理します。
私はncursesの実装をテストしてKEY_RESIZE
。
組み込み
SIGWINCH
ハンドラを使用している場合、どのスレッドがシグナルハンドラを実行しますか?それはそんなに重要なのか?これを制御できますか?組み込み
SIGWINCH
ハンドラは1つを生成しますKEY_RESIZE
。しかし、まだ渡されていない別のキーを押すとどうなりますか?KEY_RESIZE
次の呼び出しで返されるキーは保証されますかgetch
?KEY_RESIZE
ハンドラを直接作成するよりもハンドリングが簡単に見えますSIGWINCH
。しかし、UIが応答するようにキーが渡されるとすぐにどのように読むことができますか?転送を検出するためにstdinを選択またはポーリングできますか? stdinにのみ関連し、stdinには関連しない内部キューに配置されていますかgetch
?私自身のハンドラを書くとき、
SIGWINCH
私のシグナルハンドラコードがncursesを中断しないように(信号が渡されたときに呼び出せない関数を呼び出すなど)、ncursesコンテキストについてどのような保証がありますか?ncurses自体はシングルスレッドですか、それともマルチスレッドですか?
SIGWINCH
メインスレッドを除くすべてのスレッドでシグナルをブロックすると、SIGWINCH
メインスレッド(ncursesライブラリによって生成された内部スレッドではない)からのシグナルの受信が保証されますか?
答え1
以下はいくつかの質問です。簡単に:
ncursesはシングルスレッドです。
呪い設定可能(ビルド時)再進入性を向上させ、構造に対するミューテックスの使用を簡素化するためのいくつかの機能を追加します。ただし、ほとんどのパッケージャはこの機能を使用しません。一部のncursesサンプルプログラムはこの機能を示しています。
ほとんどのCurses実装(たとえば、35年以上の新しいバージョン)
wgetch
では、非ブロック方式または非常に短いタイムアウトで呼び出すことができます。KEY_RESIZE
特別待遇を受ける(同じように先入選出文字として入力され、影響を受けません。keypad
設定の説明に従ってwgetch
マニュアルページ)。スレッドアプリケーションの(デフォルト!)サポートを含むncurses設定を使用しない限り(そしてそれ制限事項)すべてのncurses入力/出力は単一スレッドになければなりません。他のスレッドは必要に応じて実行できます。
ncursesは、信号の到着を記録するために静的(持続的/グローバル)変数を使用します。これは、ハンドラを設定したスレッドと他のスレッドに到着する信号の潜在的な問題を潜在的に排除します。しかし、提案通りここ、バグを発見することができます。