2014-01-27 2 views
0

Если я компилирую и запускаю код как есть, процесс будет работать с 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); 
} 
+0

«Я думал, что g_main_loop_run() должен выполняться только в одном потоке (если вы не используете макросы GDK_THREADS_ENTER/GDK_THREADS_LEAVE)» - это предложение на самом деле не имеет смысла. Конечно, основной цикл и обратные вызовы выполняются в одном потоке, но нет гарантии, что за кулисами используется только один поток. – jku

+0

Хорошо, поэтому я думаю, что ответ «не беспокойтесь об этой другой теме, это не влияет на вас». Я сделал небольшой эксперимент, чтобы убедиться, что обратные вызовы никогда не вызывались с ThreadId другого потока, и они не были. Это была моя главная забота. Я думаю, что Gtk, вероятно, использует другой поток для повышения производительности. Спасибо за ответ. – Vern

ответ

1

Иногда GThread s создается при использовании функции, которые зависят от поведения асинхронного. Они обычно создают GTask внутренне (с g_task_run_in_thread и друзьями) и запускают синхронную версию в отдельном потоке (за исключением тех, которые являются nativly асинхронными или асинхронными, обычно они не будут порождать другой поток). Обычно это IO (т. Е. GtkBuilder), Socket и IPC (dbus), связанный, в основном, с glib.

Также могут быть случаи, о которых я не знаю, что вызовет появление новых потоков, сам mainloop строго одинарный.

Так что в вашем случае я могу думать только о двух вещах, которые могут вызвать это: изображение на складе, загруженное с вашего локального диска или информацию о стиле вашей темы.

Смежные вопросы