为啥 gtkmm 有时会自动创建第二个线程?
Posted
技术标签:
【中文标题】为啥 gtkmm 有时会自动创建第二个线程?【英文标题】:Why does gtkmm automatically create a second thread sometimes?为什么 gtkmm 有时会自动创建第二个线程? 【发布时间】:2014-01-27 23:56:07 【问题描述】:如果我按原样编译和运行代码,该进程将使用 1 个线程运行。如果我取消注释已注释掉的部分,然后编译并运行它,它会以 2 个线程运行。
我正在使用以下命令编译代码:
g++pkg-config gtkmm-2.4 --cflags --libs
test.cpp
当程序运行时,我可以检查创建了多少线程:
ps -mC a.out
如果我查看 ddd 中的第二个线程,我可以看到它正在运行 g_main_loop_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 宏)”——这句话真的没有意义。当然,主循环和回调在一个线程中运行,但不能保证在后台只使用一个线程。 好的,所以我想答案是“不要担心其他线程,它不会影响你”。我做了一个小实验,以确保从未使用其他线程的 ThreadId 调用回调,而实际上它们没有。这是我主要关心的问题。我猜 Gtk 可能使用另一个线程来提高性能。感谢您的回复。 【参考方案1】:有时GThread
s 是在您使用依赖异步行为的函数时创建的。这些通常在内部创建一个GTask
(与g_task_run_in_thread
和朋友一起)并在单独的线程中运行同步版本(除了那些天生异步或异步的,那些通常不会产生另一个线程)。通常这是 IO(即 GtkBuilder)、Socket 和 IPC (dbus) 相关的 - 所以主要是 glib
的东西。
可能还有一些我不知道的情况,会产生额外的线程,主循环本身是严格的单线程。
因此,在您的情况下,我只能想到两件事可能会触发此问题:从本地磁盘加载的 Stock 图像或主题的样式信息。
【讨论】:
以上是关于为啥 gtkmm 有时会自动创建第二个线程?的主要内容,如果未能解决你的问题,请参考以下文章
css为啥有时候创建div是块的高度为0无法把div下面的内容包含进去就像下面这例子