LINUX.ORG.RU

GTK+ интерфейс. Как сделать, чтобы не подвисал во время долгих вычислений


0

0

Программа с интерфейсом на GTK.

Основная часть - работа цикла

	while (...) {
		func ();
	}

Функция func () производит действия,  по времени заметные для человека.
Её вывод необходимо направить в некоторый GtkTextView, так, чтобы ничего
не тормозило и интерфейс отрисовывался мгновенно.
Функцию func сильно править нельзя.


Вариант

	while (...) {
		func ();
		while (gtk_events_pending ())
			  gtk_main_iteration ();
	}

не подходит, т.к. становится заметно время работы func (), и интерфейс
подвисает. Прятать gtk_events_pending () внутрь func () тоже нельзя.

Подскажите как можно поступить - потоки, ещё что-нибудь?


А ещё было бы, чтобы интерфейс и вычисления работали независимо друг от друга:
по прошествию одной итерации в цикле обновляется интерфейс:

	while (...) {
		func ();
		update ();
	}
Основная задача - неподвисающий интерфейс
★★★★★

Re: GTK+ интерфейс. Как сделать, чтобы не подвисал во время долгих вычислений

> не подходит, т.к. становится заметно время работы func ()

Тогда - потоки. Запустить func() в отдельном потоке и направить из неё вывод в pipe, в основном потоке читать из него и писать в TextView.

Sikon ★★★ ()

Re: GTK+ интерфейс. Как сделать, чтобы не подвисал во время долгих вычислений

А где об этом почитать? Дайте какую-нибудь функцию (функцию glib ?) для ориентировки

ttnl ★★★★★ ()

Re: GTK+ интерфейс. Как сделать, чтобы не подвисал во время долгих вычислений

man pthread_create()

google Posix threads

Хотя можно и банальным fork() обойтись, а данные через pipe гонять (eсли данных не много). Но все зависит от того, меняет ли func() глобальные переменные...

mky ★★★★★ ()

Re: GTK+ интерфейс. Как сделать, чтобы не подвисал во время долгих вычислений

Поищите на planet.gnome.org - там недавно один мужик как раз про многотредность и gtk грузил

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