LINUX.ORG.RU

Gtkmm, Glib::Dispatcher и блокирование обработчика сигналов


0

0

Добрый день.

Потихоньку вливаюсь в Gtkmm и столкнулся со следующей проблемой:

У меня многопоточное приложение. Каждый поток занимается отдельной задачей. Чтобы потоки могли сообщать Gtk потоку о результатах своей работы и передавать данные, я использую Glib::Dispatcher. Для каждого потока у меня создан отдельный его экземпляр, и каждый поток генерирует сигналы через "свой" Glib::Dispatcher.

Проблема заключается в следующем - если при обработке сигнала какого-либо Glib::Dispatcher'а я отображаю диалог, который блокирует выполнение сигнала:
Gtk::MessageDialog dialog(parent_window, message, false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
dialog.run();
то пока пользователь не нажмет на кнопку OK, обработчики других Dispatcher'ов вызываться не будут, несмотря на то, что потоки будут генерировать для них сигналы. После нажатия пользователем на кнопку OK произойдет последовательный запуск обработчиков всех Dispatcher'ов для всех сгенерированных за это время сигналов.

Подскажите, пожалуйста, можно ли как нибудь решить эту проблему (чтобы при открытии диалога посредством dialog.run() блокировался только обработчик текущего Dispatcher'а, а не всех, которые присутствуют в программе)?

anonymous

Прямого ответа на вопрос у меня, к сожалению, нет. Я использую GTK+ и решал подобную проблему с помощью g_idle_add(), но первое прямое решени, которое приходит на ум описано здесь: http://library.gnome.org/devel/glib/stable/glib-Asynchronous-Queues.html Тем более, когда читаешь в введении: Often you need to communicate between different threads.

Андрей

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.