gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:11 24 4
gpt4 key购买 nike

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

我正在用这个命令编译代码: g++ pkg-config gtkmm-2.4 --cflags --libs 测试.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);
}

最佳答案

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

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

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

关于linux - 为什么 gtkmm 有时会自动创建第二个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21394289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com