マルチスレッドncursesプログラムのウィンドウのサイズ変更

マルチスレッドncursesプログラムのウィンドウのサイズ変更

全体的な質問は簡単です。

マルチスレッドncursesプログラムでウィンドウサイズを適切に調整するには?


詳しくはこちらをご覧ください。いくつかの関連質問を読みました(12サム)。私が理解したのは、基本的にウィンドウのサイズ変更を処理する2つの方法があります。

  1. endwinrefreshユーザー自身のハンドラから呼び出されますSIGWINCH

  2. ncurses組み込みSIGWINCHハンドラgetchaを活用しKEY_RESIZEて処理します。

私はncursesの実装をテストしてKEY_RESIZE

  1. 組み込みSIGWINCHハンドラを使用している場合、どのスレッドがシグナルハンドラを実行しますか?それはそんなに重要なのか?これを制御できますか?

  2. 組み込みSIGWINCHハンドラは1つを生成します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は、信号の到着を記録するために静的(持続的/グローバル)変数を使用します。これは、ハンドラを設定したスレッドと他のスレッドに到着する信号の潜在的な問題を潜在的に排除します。しかし、提案通りここ、バグを発見することができます。

おすすめ記事