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);
}
「我以爲g_main_loop_run()應該只運行在一個線程中(除非你使用GDK_THREADS_ENTER/GDK_THREADS_LEAVE宏)」 - 這句話沒有意義。當然,主循環和回調在一個單獨的線程中運行,但不能保證在後臺只使用一個線程。 – jku
好的,所以我想答案是「不要擔心其他線程,它不會影響你」。我做了一個小實驗,以確保回調函數從來沒有被其他線程的ThreadId調用,但它們不是。這是我最關心的問題。我猜Gtk可能使用其他線程來提高性能。感謝您的迴應。 – Vern