2012-04-25 3 views
1

다음은이 문제를 설명하기위한 최소 예입니다. 버튼을 클릭하면 텍스트가 포함 된 500 개의 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

동의, 나는 treeview를 사용합니다. – 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 *가 과도한 것 같습니다. –