LINUX.ORG.RU

[Gtk, GLib] Есть ли удобный таймер?


0

0

Я привыкла, что есть объект, который через определенные промежутки времени эмитит сигналы, к которым можно присасываться и выполнять свои дела. QTimer, как пример. В GLib я нашла только Timeout, который совсем не похож на то, что я описала. Есть ли что-то более удобное?

Ответ на: комментарий от VladimirMalyk

>а как по твоему работает QTimer на самом деле?
Какая разница, как он реализован? Эти низкоуровневые штуки - не то, чем нужно заниматся при разработки GUI. А то так можно дойти до создания очередной мини-ОС. Не говоря уже о том, как это все будет потом работать.

anonymous
()

g_timeout_add чем не подходит? именно "через определенные промежутки времени эмитит сигналы, к которым можно присасываться и выполнять свои дела"

waker ★★★★★
()

Непонятно, чем g_timeout_add плох?

pathfinder ★★★★
()
Ответ на: комментарий от waker

Может быть мы о разных вещах говорим?
http://references.valadoc.org/glib-2.0/GLib.Timeout.add.html
Вот это не эмитит никаких сигналов и остановить его можно только возвратив false, что никак не подходит, так как нужно останавливать немедленно.

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

>Может быть мы о разных вещах говорим?

Эээээ..... Vala???? Это что такое??? о_О Признаться честно я не очень силен в GTK. Я говорил про http://library.gnome.org/devel/glib/stable/glib-The-Main-Event-Loop.html#g-ti... В одном из параметров функции передаем обработчик событий. В этом обработчике эмитим/вызываем/"куём и мелем" или что вам там надо сделать. Если нужно вызвать событие только один раз, возвращаем в обработчике false, если необходимо периодическое срабатывание, возвращаем true.

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

Как я понял g_timeout_add () полностью повторяет функционал QTimer

pathfinder ★★★★
()
Ответ на: комментарий от const86

да я ничего против не имею. просто, нелишним было бы написать, почему тов. анонимус посчитал, что это плохо.

g
()
Ответ на: комментарий от pathfinder

Кажется, я уже написала свой аналог QTimer :) У меня мозги вскипают, когда я пытаюсь мыслить понятиями GLib. Вот код, покритикуйте, кому интересно:

public class SmartTimer : Object
{
	private double _timeout;
	private Timer timer;
	private bool stoped = false; 
	
	public signal void timeout();
	
	public SmartTimer(double timeout)
	{
		_timeout = timeout;
		timer = new Timer();
		timer.start();
		start();
	}
	
	public void stop()
	{
		stoped = true;
	}
	
	public void start()
	{
		stoped = false;
		Thread.create(timer_loop, false);
	}
	
	private void *timer_loop()
	{
		while(!stoped)
		{
			if(timer.elapsed() >= _timeout)
			{
				timeout();
				timer.start();
			}
		}
		return null;
	}
}

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

Пардон, но оно кушает целое ядро. Что я не так делаю?

Dirty_Diana
() автор топика
Ответ на: комментарий от g

>а как по твоему работает QTimer на самом деле?

Я так понимаю во всех нормальных системах с GUI есть свой таймер, завязанный на цикле обработки событий. Ему совершенно не нужно порождать ещё одну нить, чтоб все это работало. QTimer вроде тоже не создает дополнительных нитей.

pathfinder ★★★★
()
Ответ на: комментарий от Dirty_Diana
while(!stoped)
{
  if(timer.elapsed() >= _timeout)
  {
     timeout();
     timer.start();
  }
}

Это ведь цикл без засыпания, нить должна кушать 100% процессорного времени. Может какой-нибудь sleep(timeout) или как его там?

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

А ведь точно. Можно совсем без таймера обойтись, пуская цикл, в котором вызывается sleep с заданным временем. Вот как все просто :)

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

критикую:
уберите этот ужасный яп!

g
()
Ответ на: комментарий от Dirty_Diana

>А ведь точно. Можно совсем без таймера обойтись, пуская цикл, в котором вызывается sleep с заданным временем. Вот как все просто :)

Только не надо делать велосипед, это я так, объяснил причину тормозов. Используй аналог g_timeout_add из классического GTK/Pure C. Просто тут используется какой-то б-гомерзкий язык программирования, я не могу сориентироваться в нем. Используй этот самый GLib.Timeout.add.

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

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

Dirty_Diana
() автор топика

В общем, я нашла золотую середину :) Но все же timeout_add - очень неудобный и ограниченный способ.

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

>Я не понимаю, как с помощью этой штуки можно взять и поменять интервал на лету.

Я теперь понял. Действительно в этом плане g_timeout_add() не очень удобна. Изменить на лету, это в данном случае значит уничтожить старый таймер и создать новый с другим интервалом. Функция g_timeout_add() возвращает ID этого таймера (точнее ID event source). Я точно не уверен, но вроде для уничтожения event source можно воспользоваться функцией g_source_remove(). В качестве параметра ей передается этот самый ID.

З.Ы. Названия функций здесь для GTK/Pure C. Должны быть аналоги в твоем языке программирования.

З.З.Ы. Может не стоит городить эту кашу с таймерами, если легкого и красивого пути нет. Наверняка можно решить данную проблему изменением дизайна приложения.

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

Мне действительно нужен таймер :) Но я уже все решила. Просто в моем случае интервалы очень большие, не меньше минуты. Я просто каждую минуту проверяю, не достигло ли значение (которое я инкрементирую) заданного интервала. Если достигло - сигналю и сбрасываю значение, а сам timeout не трогаю. Вполне работает, на лету тоже меняется. Так что меня устраивает. Спасибо за помощь :)

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

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

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