2014-01-27 22 views
0

如果我按原樣編譯並運行代碼,則該進程將以1個線程運行。如果我取消註釋掉的註釋部分,然後編譯並運行它,它將運行2個線程。爲什麼gtkmm有時自動創建第二個線程?

我編譯用這個命令代碼: G ++ pkg-config gtkmm-2.4 --cflags --libs TEST.CPP

當程序運行時,我可以檢查多少線程與創建: ps -mC a.out

如果我看看第二在DDD線程,我可以看到它正在運行g_main_loop_run。這使我困惑:

  • 此線程的目的是什麼?
  • 爲什麼添加一個工具欄按鈕創建一個新的線程?
  • 我以爲g_main_loop_run()應該只運行在一個線程中(除非使用GDK_THREADS_ENTER/GDK_THREADS_LEAVE宏)。由於我在主線程中運行Gtk :: Main :: Run(),違反了規則?

在此先感謝您的幫助。這讓我瘋狂。

#include <gtkmm.h> 

bool OnDeleteEvent(GdkEventAny* PtrGdkEventAny) 
{ 
    Gtk::Main::quit(); 
    return(true); 
} 

void OnExecuteButtonClicked() 
{ 
} 

int main(int argc, char *argv[]) 
{ 
    new Gtk::Main(0, NULL); 

    Gtk::Window *ptrWindow = new Gtk::Window; 
    ptrWindow->signal_delete_event().connect(sigc::ptr_fun(&OnDeleteEvent)); 

    /* 
    Gtk::Toolbar *ptrToolBar = manage(new Gtk::Toolbar); 
    Gtk::ToolButton *ptrToolButton; 

    ptrToolButton = manage(new Gtk::ToolButton(Gtk::Stock::EXECUTE)); 
    ptrToolBar->append(*ptrToolButton, sigc::ptr_fun(&OnExecuteButtonClicked)); 

    ptrWindow->add(*ptrToolBar); 
    */ 

    ptrWindow->show_all(); 
    Gtk::Main::run(); 

    return (0); 
} 
+0

「我以爲g_main_loop_run()應該只運行在一個線程中(除非你使用GDK_THREADS_ENTER/GDK_THREADS_LEAVE宏)」 - 這句話沒有意義。當然,主循環和回調在一個單獨的線程中運行,但不能保證在後臺只使用一個線程。 – jku

+0

好的,所以我想答案是「不要擔心其他線程,它不會影響你」。我做了一個小實驗,以確保回調函數從來沒有被其他線程的ThreadId調用,但它們不是。這是我最關心的問題。我猜Gtk可能使用其他線程來提高性能。感謝您的迴應。 – Vern

回答

1

有時GThread s是在您使用依賴異步行爲的函數時創建的。這些通常會在內部(與g_task_run_in_thread和朋友)創建GTask,並在單獨的線程中運行同步版本(除非那些本機異步或異步,那些通常不會產生另一個線程)。通常這是IO(即GtkBuilder),Socket和IPC(dbus)相關 - 所以主要是glib東西。

也可能有些情況我不知道,會產生額外的線程,主循環本身是嚴格單線程的。

所以在你的情況下,我只能想到兩件事情可能觸發這個:從本地磁盤加載的股票圖像或你的主題的樣式信息。

相關問題