2012-04-25 11 views
1

問題を説明するための最小限の例を示します。ボタンをクリックすると、500個のTextViewオブジェクトが追加され、それぞれにテキストが含まれます。実際には、短い遅延があり、空のTextViewが500個追加され、遅延が長くなり、テキストが一度に読み込まれ、レイアウトのサイズが正しく設定されます。以下のコード:多くのtextviewを一度に追加するとgtkdのパフォーマンスの問題が発生する

import gtk.Button; 
import gtk.Main; 
import gtk.MainWindow; 
import gtk.Notebook; 
import gtk.ScrolledWindow; 
import gtk.Statusbar; 
import gtk.TextView; 
import gtk.TextBuffer; 
import gtk.UIManager; 
import gtk.VBox; 
import gtk.Window; 

import std.stdio; 

class UI : MainWindow 
{ 
    Notebook notebook; 

    this() { 
    super("Test"); 
    setDefaultSize(200, 100); 
    VBox box = new VBox(false, 2); 
    notebook = new Notebook(); 
    Button button = new Button("add lines"); 
    button.addOnClicked(&addLines); 
    box.packStart(notebook, true, true, 0); 
    box.packStart(button, false, false, 2); 
    add(box); 
    showAll(); 
    } 

    void addLines(Button b) { 
    VBox box = new VBox(false, 2); 
    for (int i = 0; i < 500; i++) { 
     auto tv = new TextView(); 
     tv.getBuffer().setText("line"); 
     box.packStart(tv, false, false, 1); 
    } 
    ScrolledWindow swin = new ScrolledWindow(box); 
    notebook.add(swin); 
    showAll(); 
    } 
} 

void main(string[] args) 
{ 
    Main.init(args); 
    auto ui = new UI(); 
    Main.run(); 
} 

編集this threadテキストビューの束を作成することは本質的に高価であり、私はツリービューを使用して書き換えする必要があることを示唆しています。

+0

合意して、私はツリービューを使用します。 – ptomato

答えて

1

グーグルで実験した後、GtkTextViewsは本質的にインスタンス化するのに費用がかかることが分かりました。私は非常に多くのものを作成しようとはしていませんでした。 this threadのアドバイスに従って、代わりにGtkTreeViewを使用するようにコードを修正します。

2

GTKはイベントドリブンであり、メッセージポンプを使用します。コールバックで長時間の操作を行うと、保留中のメッセージを処理するチャンスをメッセージポンプに与えることは決してありません。コールバック内のコードを2秒間スリープさせると、その効果は同じになります。UIはそのタイムスライス中にフリーズします。

あなたは、あなたの行動を分割gtk_events_pendingマニュアルに記載されているもののD相当を使用できない場合は、次の

あなたのループの反復のそれぞれの間に呼び出され
/* computation going on */ 
... 
    while (gtk_events_pending()) 
     gtk_main_iteration(); 
... 
/* computation continued */ 

、それはプロセスにGTKにいくつかの時間を与えるだろうウィジェットを追加して生成したイベント。

+0

空のテキストビューが表示されるのはなぜですか? textview.getbuffer.settext()呼び出しはvbox.packstart(textview)の前に来るので、textviewsを追加するのに遅れがあったとしても、それらが完全に表示されると思われます。なぜ500のテキストビューを追加するのが遅いのですか?それはあまりにも多くの数のようには思われません、そして、私はgtk2/haskellで同じ問題を覚えていません。 –

+0

私はgtk_events_pendingを使ってみましたが、それは応答を維持しますが、さらに読み込みが遅くなります。 –

+0

doh - 私はちょうど私がGtkTextViewではなくGtkEntryを使用していた何かをやっていた私の古いhaskellコードを認識しました。それは500のtextviews *のように見えます*過剰です。 –

関連する問題