LINUX.ORG.RU

Как определить, почему окно перестает отвечать?

 ,


0

1

Любое из менение в интерфейсе после создания окна приводит к тому, что через некоторое время «Окно не отвечает». Например, на основе сигнала отображение прогресса. Пробовал ставить константу «0.5», как в примере ниже - также окно подвисает. Если закомментиhовать «progress.set_fraction (0.5);», то с окном все в порядке.
Что не правильно? И как определить причину зависания?

namespace Temp {
	[GtkTemplate (ui = "/org/gnome/Temp/window.ui")]
	public class AppWindow : Gtk.ApplicationWindow {

                PObject p;

		[GtkChild]
		private Gtk.ProgressBar progress;

		public AppWindow (Gtk.Application app) {
			Object (application: app);

                        p = new PObject ();
                        p.position_changed.connect (position_changed_cb);
		}
	}
	private void position_changed_cb (double pos) {
		    
                progress.set_fraction (0.5);

	}

}
★★★

Последнее исправление: nvl (всего исправлений: 1)

А что за объект и что за сигнал position changed такой (сигнал на valadoc не ищется)?
Проще пожалуй взять отладчик и посмотреть в каких функциях зависает программа (можно графический фронтенд к gdb взять - nemiver, там остановить процесс и емнип на вкладке Контекст будет стек вызовов с именами функций).

Tayler ★★
()
Последнее исправление: Tayler (всего исправлений: 1)
Ответ на: комментарий от Tayler

А что за объект и что за сигнал position changed такой (сигнал на valadoc не ищется)?

Тут, как я понимаю, объект и сигнал не при чем. Если добавить вывод в консоль:

private void position_changed_cb (double pos) {
		    
                stdout.printf ("Pos: %f\n", pos);
                progress.set_fraction (0.5);

	}
то окно перестает отвечать, а в консоли продолжает сыпать:
Pos: 0,169089
Pos: 0,169102
Pos: 0,169114
Pos: 0,169126
Pos: 0,169138
т.е. сигнал эмитируется и функция получает значение. Может в классе окна что-то пропущено, какие-нибудь обработчики..

Проще пожалуй взять отладчик и посмотреть в каких функциях зависает программа (можно графический фронтенд к gdb взять - nemiver, там остановить процесс и емнип на вкладке Контекст будет стек вызовов с именами функций).

Как бы программа не зависает, только окно подвисает: «окно не отвечает, подождать или завершить принудительно?», а сама программа выполняется.

Попробовал nemiver, с ходу не понятно, буду пробовать разобраться..

nvl ★★★
() автор топика
Ответ на: комментарий от Tayler

Разобрался. GLib.Source в GLib.MainContext.

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