2012-04-25 41 views
1

下面是說明問題的最簡單示例。單擊按鈕時,應添加500個TextView對象,每個對象都包含一些文本。實際發生的情況是,有一個短暫的延遲,添加了500個空的TextViews,延遲時間更長,然後它們都會立即填充文本,並且佈局自行調整。下面的代碼:gtkd一次性添加大量文字查看時的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說明,創建了一堆的文本視圖在本質上是昂貴的,我應該使用一個TreeView被改寫。

+0

同意,我會使用樹視圖。 – ptomato 2012-04-26 07:12:18

回答

1

經過一些更多的Google搜索和實驗後,事實證明,GtkTextViews實例化本質上很昂貴,我不應該試圖創建它們中的很多。根據this thread的建議,我將重新編寫我的代碼來使用GtkTreeView。

2

GTK是事件驅動的,並使用消息泵。如果在回調中執行冗長的操作,則永遠不會給消息泵處理待處理消息的機會。您可以用2秒的休眠時間代替回調中的代碼,效果將會相同:在該時間段內,UI將被凍結。

如果您不能分割你的行動,使用d相當於什麼是gtk_events_pending文檔描述的:

/* computation going on */ 
... 
    while (gtk_events_pending()) 
     gtk_main_iteration(); 
... 
/* computation continued */ 

每個循環迭代之間的調用,它會給一些時間來GTK處理您通過添加小部件而生成的事件。

+0

爲什麼會顯示空文本視圖? textview.getbuffer.settext()調用會在vbox.packstart(textview)之前出現,所以即使在添加textviews時出現延遲,我希望它們顯示爲完全填充。爲什麼要添加500個textviews如此緩慢?它看起來不是一個過大的數字,我不記得在gtk2/haskell中有同樣的問題。 – 2012-04-25 20:46:06

+0

我嘗試使用gtk_events_pending,它確實保持了ui的響應速度,但減慢了加載速度。 – 2012-04-26 06:10:48

+0

doh - 我剛剛意識到我的舊haskell代碼,我在做類似的事情時使用的是GtkEntry而不是GtkTextView。所以它看起來像500 textviews *是*過度。 – 2012-04-26 07:22:33