2012-01-12 2 views
0

В нашем проекте мы используем gtkmm, и у нас есть несколько классов, которые расширяют Gtk::Window, чтобы отобразить наш графический интерфейс.gtkmm-Window остается пустым

теперь я узнал, что вызов производит поведение (как описано в предыдущей версии. Теперь вопрос немного изменился.)

Мы отображая одно окно, работает как шарм.

Затем у нас есть окно, которое отображает различные сообщения о состоянии. Назовем это MessageWindow. Он имеет метод setMessage(Glib::ustring msg), который просто вызывает метку set_text().

После некоторой обработки мы снова спрячем это окно, и теперь мы показываем панель инструментов. Просто еще одно простое окно, ничего сумасшедшего.

Для всех окон применяется: Основной поток вызывает show() в окне и создает новый поток, который вызывает Gtk::Main::run() (без аргумента).

Так оно и должно быть, до сих пор.

Проблема начинается здесь: основная тема сейчас хочет называть MessageWindow::setMessage("any string"). a) если я вызываю этот метод, окно сообщений реагирует полностью правильно. Но после этого окно панели инструментов отображается пустым. б) если я его не назову, окно сообщения не изменяет ярлык (что абсолютно ясно), и окно панели инструментов отображается так, как должно.

Кажется, что окна возились друг с другом.

Теперь вопрос:

Если мой графический интерфейс-нить блокирует в Gtk::Main::run(), как я могу прямо сейчас изменить текст этикетки?

Мы используем gtkmm-2.4 (и нет, мы не можем обновить)

Любая помощь приветствуется.

ответ

1

Wow! Это сложно ...

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

Теоретически возможно заставить его работать (в Linux, в Windows это невозможно), но это больше проблем, чем того стоит.

Во-вторых: строка Gtk::Main main(argc, argv) не является вызовом, это объявление объекта. Основной объект должен жить на протяжении всей программы, поэтому, если вы используете его в конструкторе объекта, как только вы вернетесь от него, объект будет уничтожен! Просто поставьте его на верхнюю часть основной функции и забудьте об этом.

UPDATE: Мой обычный подход здесь - создать канал, g_io_channel для чтения и записи байтов на другом конце.

Другой вариант, хотя я не тестировал его, чтобы позвонить, получите GMainContext основного потока, а затем g_idle_source_new() и прикрепите этот источник к основному контексту с помощью g_source_attach().Если вы попробуете этот, и он работает, отправьте свой результат здесь!

+0

Спасибо за ваш ответ. Я знал о жизни «Gtk :: Main». Эта вещь живет так долго, как это делает контроллер. Как правило, я получаю доступ только к графическому интерфейсу из одного потока. Но есть одно исключение, которое, похоже, вызывает проблему. Я изменяю свой вопрос – Atmocreations

+0

Но обратите внимание, что поток, который создает Gtk :: Main, должен быть единственным и единственным, который создает окна и манипулирует ими. Ваш вопрос, кажется, подразумевает, что вы вызываете 'show' в одном потоке и вызываете' run' в другом. – rodrigo

+0

есть. это то, что я делаю. казалось, работал без проблем ... как это можно было бы решить иначе? запускать все действия прямо из gui? – Atmocreations

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