1

GTK を使用していますが、テキストを TextView に挿入すると、バックグラウンド スレッドで処理されているようです。

  1. 1行にテキストを挿入します
  2. 私は他のことをしていますが、この瞬間、テキストはまだそこにレンダリングされていません
  3. ScrollToIter() を使用して下にスクロールしますが、テキストがまだレンダリングされておらず、スクロールする終わりがないため、実際には何も起こりません

スクロールを挿入してタイマーを終了すると、機能しますが、かなり遅くて奇妙です。(テキストは最初に描画され、描画が完了すると下にジャンプします。長いテキストの場合、描画に時間がかかるため、数回ジャンプします)。

また、Buffer.Text を変更するたびに、コントロールはすべての行を再描画します (ループ内で行ごとに追加されますが、これも非常に面倒です)。

私がする必要があるのは、次のとおりです。

  1. TextView.Buffer.Text を別の文字列に変更します
  2. すべてのテキストを処理してすぐに再描画するように TextView を強制する
  3. 一番下までスクロール

例:

大きなテキスト ファイル (100 000 行) を開くテキスト エディターを作成し、ファイルを開いた直後に一番下までスクロールするとします。理想的には、ファイルを開いて最初に表示されるのはファイルの下部です。これは、多くのテキスト エディターで発生することです。この動作をこの gtk で実装したいと思います。

どうやってやるの?

4

1 に答える 1

1

これは、メイン ループ ベースのツールキットでのイベント ドリブン プログラミングのしくみではありません。GTK+ などのメイン ループを使用するツールキットを使用したイベント ドリブン プログラミングの基本原則は、メイン ループをブロックしないことです。

GTK+ は、レンダリングとレイアウトに個別のスレッドを使用しません。実行するすべてのブロック操作は、描画、イベント処理、および独自のコードを含む他の操作の実行を妨げます。

TextBuffer が提供する通知シグナルを使用して、バッファが更新されたら TextView の一番下までスクロールする必要があります。また、(長い) テキストをタイトなループに挿入するべきではありません: テキストを 1 行ずつ、またはチャンクごとに挿入する場合は、ジョブをより小さな断片に分割し、アイドル コールバックまたはタイムアウト コールバックを使用する必要があります。メインループ内で実行されます。

于 2013-03-27T19:57:35.773 に答える