Если я компилирую и запускаю код как есть, процесс будет работать с 1 потоком. Если я раскомментирую комментируемую секцию, а затем ее компилирую и запускаю, она запускается с двумя потоками.Почему gtkmm автоматически создает второй поток?
Я компиляции кода с помощью этой команды: г ++ pkg-config gtkmm-2.4 --cflags --libs
test.cpp
Когда программа запущена, я могу проверить, сколько потоков создаются: ps -mC a.out
Если я смотрю на второй thread в 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);
}
«Я думал, что g_main_loop_run() должен выполняться только в одном потоке (если вы не используете макросы GDK_THREADS_ENTER/GDK_THREADS_LEAVE)» - это предложение на самом деле не имеет смысла. Конечно, основной цикл и обратные вызовы выполняются в одном потоке, но нет гарантии, что за кулисами используется только один поток. – jku
Хорошо, поэтому я думаю, что ответ «не беспокойтесь об этой другой теме, это не влияет на вас». Я сделал небольшой эксперимент, чтобы убедиться, что обратные вызовы никогда не вызывались с ThreadId другого потока, и они не были. Это была моя главная забота. Я думаю, что Gtk, вероятно, использует другой поток для повышения производительности. Спасибо за ответ. – Vern