为什么gtkmm有时会自动创建第二个线程?

时间:2014-01-27 23:56:08

标签: linux multithreading gtk gtkmm

如果我按原样编译并运行代码,则该进程将以1个线程运行。如果我取消注释注释掉的部分,然后编译并运行它,它将以2个线程运行。

我正在用这个命令编译代码:     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);
}

1 个答案:

答案 0 :(得分:1)

当您使用依赖异步行为的函数时,有时会创建GThread。这些通常在内部创建GTask(与g_task_run_in_thread和朋友一起)并在单独的线程中运行同步版本(除了那些通常是异步或异步的,那些通常不会产生另一个线程) 。通常这是IO(即GtkBuilder),Socket和IPC(dbus)相关 - 所以主要是glib

可能还有一些我不知道的情况,那会产生额外的线程,mainloop本身就是严格的单线程。

因此,在您的情况下,我只能想到两个可以触发此事情的事情:从本地磁盘加载的Stock图像或主题的样式信息。