Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么gtkmm有时会自动创建第二个线程?_Linux_Multithreading_Gtk_Gtkmm - Fatal编程技术网

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

Linux 为什么gtkmm有时会自动创建第二个线程?,linux,multithreading,gtk,gtkmm,Linux,Multithreading,Gtk,Gtkmm,如果我按原样编译并运行代码,进程将以1个线程运行。如果我取消注释注释掉的部分,然后编译并运行它,它将运行两个线程 我正在使用以下命令编译代码: g++pkg config gtkmm-2.4--cflags--libstest.cpp 当程序运行时,我可以检查创建了多少线程: ps-mca.out 如果我查看ddd中的第二个线程,我可以看到它正在运行g\u main\u loop\u run。这让我很困惑: 这条线的目的是什么 为什么添加工具栏按钮会创建新线程 我认为g_main_loop_r

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

我正在使用以下命令编译代码: g++
pkg config gtkmm-2.4--cflags--libs
test.cpp

当程序运行时,我可以检查创建了多少线程:
ps-mca.out

如果我查看ddd中的第二个线程,我可以看到它正在运行
g\u main\u loop\u 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);
}
#包括
bool OnDeleteEvent(GdkEventAny*PtrGdkEventAny)
{
Gtk::Main::quit();
返回(真);
}
void OnExecuteButtonClicked()
{
}
int main(int argc,char*argv[])
{
新的Gtk::Main(0,NULL);
Gtk::Window*ptrWindow=新的Gtk::Window;
ptrWindow->signal_delete_event().connect(sigc::ptr_fun(&OnDeleteEvent));
/*
Gtk::Toolbar*ptrToolBar=manage(新的Gtk::Toolbar);
Gtk::ToolButton*ptrToolButton;
ptrToolButton=manage(新的Gtk::ToolButton(Gtk::Stock::EXECUTE));
ptrToolBar->append(*ptrToolButton,sigc::ptr_fun(&OnExecuteButtonClicked));
ptrWindow->add(*ptrToolBar);
*/
ptrWindow->show_all();
Gtk::Main::run();
返回(0);
}

有时使用依赖异步行为的函数时会创建
GThread
s。它们通常在内部创建一个
GTask
(使用
g_task\u run\u in_thread
和friends)并在一个单独的线程中运行同步版本(除了那些本机异步或可异步的线程外,通常不会产生另一个线程)。通常这是与IO(即GtkBuilder)、Socket和IPC(dbus)相关的-因此大部分是
glib
之类的东西

也可能有我不知道的情况,会产生额外的线程,mainloop本身是严格的单线程


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

“我认为g_main_loop_run()应该只在一个线程中运行(除非您使用GDK_THREADS_ENTER/GDK_THREADS_LEAVE宏)”--这句话没有真正意义。当然,主循环和回调在一个线程中运行,但不能保证只有一个线程在幕后使用。好吧,我想答案是“不要担心其他线程,它不会影响你”。我做了一个小实验,以确保回调永远不会被另一个线程的ThreadId调用,而且不会被调用。这是我最关心的问题。我猜Gtk可能会使用另一个线程来提高性能。谢谢你的回复。