Linux 为什么gtkmm有时会自动创建第二个线程?
如果我按原样编译并运行代码,进程将以1个线程运行。如果我取消注释注释掉的部分,然后编译并运行它,它将运行两个线程 我正在使用以下命令编译代码: g++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
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可能会使用另一个线程来提高性能。谢谢你的回复。