LINUX.ORG.RU

Кому нужен был таймер?

 ,


0

2

Я вообще про него забыл к тому же мама болеет, отложил все дела из за этого. Я уже не помню кому нужен был сей таймер и времени искать простите нету. Вообщем все работает. Но насчет звука программная логика такая что в windows должен работать winsound а в linux ossaudiodev но у меня ossaudiodev то это не работает, поэтому в коде стоит

try except
. Программы таймера это файлы sqllite созданные в DB browser for SQLite но в программе таймера есть возможность создавать новые программы. Каждый файл программы таймера включает в себя 2 таблицы sqlite_sequence и таблица с программой. Всего 2 комманды уведомление и пауза, к сожалению
os.startfile
в linux не работает. При наступления события уведомления но только после паузы - включается анимация иконки и периодически меняется цвет сообщения и его фон. http://xofficer.ru/images/xtimer1.png http://xofficer.ru/images/xtimer2.png



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

спасибо Korchevatel ты все правильно понял. Суть в том что очень уж ограниченный функционал получается у таймера на python и тем более для linux ну про звуковой сигнал я плохо помню а так команды были всё - уведомление и ждать, открыть текстовый документ это уже затруднительно в python эту роль выполняет os.startfile но в linux оно не работает. Да есть обходные (системные) пути дабы открыть текстовый файл то есть по сути костыли. Что касается дизайна надо было наверное делать в web но опенсорц ни причем к дизайну не стану же я цеплять https://clck.ru/1-ljT в окно для лоровских эстетов. А если такой убогий функционал то зачем такой таймер вообще нужен?

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

ну видишь лень но у этого способа могут быть иные недостатки я по этому пути все равно не пошел имхо я использовал tkinter after

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

Ну к слову сказать афтер это тот же слип, только чуть хитрее, если со вторым аргументом используется. И да tk ненужно, есть PyQt

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

открыть текстовый документ это уже затруднительно в python эту роль выполняет os.startfile но в linux оно не работает

А должно?

https://www.blog.pythonlibrary.org/2010/09/04/python-101-how-to-open-a-file-or-program/

Почитай второй раздел, так как раз об этом говорится.

Korchevatel
()
Ответ на: комментарий от peregrine

И да tk ненужно, есть PyQt

Кстати, да, влезаю со своими 50 коп, но смысл использовать фактически инородный "тулкит", если есть готовая обвязка для одного из двух самых популярных?

Korchevatel
()

Никогда не писал на питоне, но как слип может быть не точным?

rukez
()
Ответ на: комментарий от peregrine

собственно разница между tk и pyqt не важна в данном контексте. Ибо в окне нет тех контролов которых нет в tkinter и нужны в них тоже нет. Варианты с таймером такие.

  • sleep - вариант простой но не лучший из за того что нужно создавать дополнительный поток для гуёв.
  • after - как ты правильно выразился sleep только хитрее.
  • третий вариант который я опробовал замеряемые промежутки времени типа если минута еще не та то ждем в бесконечном цикле = очень хреновый вариант.

поэтому лучше все таки web если проверить что жабаскрипт включен то просто задаем таймер с интервалами времени например каждую минуту. Серверный жабоскрипт я точно не буду использовать. А вот ajax буду.

Подсуммируем: сама идея писать на python изначально была непрактичная и функционал сильно ограничен, как и мое свободное время. А вообще если надо бы придумать а что должен быть в этом таймере сначала. Если это касается кулинарных рецептов то можно бы в принципе и рецепты с какого нибудь поваренка (сайт) подгружать по rss.

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

Ты ответил на моё сообщение, которое я писал другому человеку: «А чего больно-то? Весь опенсорс такой. Посмотри дизайн F-Droid))». Больше я не писал ничего и никаких сообщений тебе не адресовывал. Поэтому спрошу ещё раз: какие таймеры, о чём ты пишешь и почему мне?

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

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

XoFfiCEr
() автор топика
Последнее исправление: XoFfiCEr (всего исправлений: 2)

я говорит таймер вам написал, а вам не нравится. а я вчера написал поисковик, который работает быстрей гугла и яндекса вместе взятых. и всего 10 строк кода на питоне. не знаю почему вы им не поьзуетесь. а, наверно потому, что я не дал вам ссылку? а ты то дал? а код то где? а как им воспользоваться?

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

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

слышь я сайт еще не закончил а к чему ты его приплел из за того душевный мир бедный да?! что это вообще выс^Wр?

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

мне заранее жалко людей которые могут случайно у тебя что нибудь заказать…

таких бездарей которые называют себя программистами/веб-разработчиками еще поискать надо…

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

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

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

Ты клоун не путай фриланс с благотворительностью.

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

а я вчера написал программу полета для spaceX на чистом ассемблере. ассемблер кстати выучил за неделю.

fakeroot
()
Ответ на: комментарий от XoFfiCEr

Отвечу тут.

Никому не интересны школьные поделки, зато это перейдёт в обсуждение говнокода — нездоровая дискуссия.

fernandos
()
Ответ на: комментарий от XoFfiCEr

sleep - вариант простой но не лучший из за того что нужно создавать дополнительный поток для гуёв.

Открою секрет - отдельный поток нужен не гую, а под каждый отдельный таймер.
Тогда:

  • будет околоидеальная точность
  • код контроля времени превращается в три строчки на таймер
  • количество параллельно работающих таймеров может быть овердофиговым ибо тыща спящих потоков это нынче пшик
rukez
()
Ответ на: комментарий от rukez

офигеть, я думал общий таймер

тыща спящих потоков это нынче пшик

да, но это всего лишь таймер, простой таймер, зачем такое городить

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

в отношении дизайна гуёв интересны, обсуждений не будет, не хочешь участвовать не надо.

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

да, но это всего лишь таймер, простой таймер, зачем такое городить

Для простого таймера тебе один фиг нужно два потока - либо для таймера либо для гуя, но если ты кидаешь отдельный поток на гуй, то как только ты захочешь сделать не 1 а 2-3-10 таймеров, ты либо будешь городить адовые костыли внутри одного потока обработки таймеров (особенно прикольно будет когда события таймеров начнут наступать во время обработки событий от других таймеров) либо один фиг придёшь к варианту 1 таймер = 1 поток

Сча накидаю на явушке скелет

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

Чот примерно так:

  • Таймеров сколько хочешь
  • Стрелять должны точно, время на обработку события тупит только таймер-генератор этого события, притом это элементарно двумя строчками компенсируется
  • Гуй может как обновляться по событиям так и просто поллить коллекцию таймеров с нужной частотой

Бонусом в пару строк можно добавить паузы раздельно по каждому таймеру

Если хоть кому-то надо оберну гуём и хранением в жсоне :-)

public static void main(String[] args) {
				
		List<TimerAction> actions1 = new ArrayList<>();
		actions1.add(new TimerAction(2000l, "Событие 1", TimerAction.TYPE_SHOW_MESSAGE));
		actions1.add(new TimerAction(3000l, "Событие 2", TimerAction.TYPE_SHOW_MESSAGE));
		actions1.add(new TimerAction(4000l, "Событие 3", TimerAction.TYPE_SHOW_MESSAGE));
		TimerSequence sequence1 = new TimerSequence("Таймер 1", actions1);
		
		List<TimerAction> actions2 = new ArrayList<>();
		actions2.add(new TimerAction(2000l, "Событие 1", TimerAction.TYPE_SHOW_MESSAGE));
		actions2.add(new TimerAction(3000l, "Событие 2", TimerAction.TYPE_SHOW_MESSAGE));
		actions2.add(new TimerAction(4000l, "Событие 3", TimerAction.TYPE_SHOW_MESSAGE));
		TimerSequence sequence2 = new TimerSequence("Таймер 2", actions2);
		
		TimerChanged listener = new TimerChanged() {			
			@Override
			public void changed(TimerSequence sequence) {
				StringBuilder sb = new StringBuilder(sequence.getName());
				sb.append(": ");
				TimerAction action = sequence.getCurrentAction();
				if (action == null) {
					sb.append("Начато исполнение");
					sb.append(" До окончания цикла: "+sequence.getTimeTillFinish());
				} else {
					sb.append("Начато действие ");
					sb.append(action.getAction()); //Можно им то-же имена раздать
					sb.append(" До окончания действия: "+sequence.getTimeTillNextAction());
					sb.append(" До окончания цикла: "+sequence.getTimeTillFinish());
				}
				System.out.println(sb.toString());
			}
		};
		sequence1.addListener(listener);
		sequence2.addListener(listener);
		
		sequence1.start(1000);
		sequence2.start(2500);
	}
public class TimerAction {
	public static final int TYPE_SHOW_MESSAGE = 1;
	private long delay = 0l;
	private String action = "";
	private int type = TYPE_SHOW_MESSAGE;
	public TimerAction(long delay, String action, int type) {			
		this.delay = delay;
		this.action = action;
		this.type = type;
	}
	public long getDelay() {
		return delay;
	}
	public void setDelay(long delay) {
		this.delay = delay;
	}
	public String getAction() {
		return action;
	}
	public void setAction(String action) {
		this.action = action;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
}
public class TimerSequence {
	private List<TimerAction> actions;
	private String name;
	private long started;
	private long delay;
	private TimerAction currentAction = null;
	private List<TimerChanged> listeners = new ArrayList<>();
	private TimerSequence sequence = this;
	public TimerSequence(String name, List<TimerAction> actions) {
		this.name = name;
		this.actions = actions;
	}
	public void addListener(TimerChanged listener) {
		listeners.add(listener);
	}
	public boolean start(long delay) {
		this.delay = delay;
		if (name != null && actions != null) {
		Thread t = new Thread(new Runnable() {	
			@Override
			public void run() {
				started = System.currentTimeMillis();
				if (delay >0) {
					try {
						Thread.sleep(delay);
					} catch (InterruptedException e) {							
						e.printStackTrace();
					}
				}					
				for (TimerAction action:actions) {
					currentAction = action;
					for (TimerChanged listener:listeners) {
						listener.changed(sequence);
					}											
					try {
						Thread.sleep(action.getDelay());
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					if (action.getType() == TimerAction.TYPE_SHOW_MESSAGE) {
//						JOptionPane.showMessageDialog(null, , "Событие таймера "+name, JOptionPane.INFORMATION_MESSAGE); // Если надо ждать реакции и начинать следующий отсчет только после подтверждения то так
						EventQueue.invokeLater(new Runnable(){	// Если не надо ждать подтверждения то так:
	                        @Override
	                        public void run() {
	                     JOptionPane op = new JOptionPane(action.getAction(),JOptionPane.INFORMATION_MESSAGE);
	                     JDialog dialog = op.createDialog("Событие таймера "+name);
	                     dialog.setAlwaysOnTop(true);
	                     dialog.setModal(true);
	                     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);      
	                     dialog.setVisible(true);
	                        }
	                    });
					}
				}
			}
		});
		t.start();
		return true;
		} else {
			return false;
		}
	}
	
	public long getStartedTime() {
		return started;
	}
	public long getTimeTillFinish() {
		long totalTime = delay;
		for (TimerAction action:actions) {
			totalTime = totalTime + action.getDelay();
		}
		return started + totalTime - System.currentTimeMillis();
	}
	public long getTimeTillNextAction() {
		long totalTime = delay;
		if (currentAction != null) {
			for (TimerAction action:actions) {
				totalTime = totalTime + action.getDelay();				
				if (action == currentAction) {
					break;
				}
			}
		}
		return started + totalTime - System.currentTimeMillis();
	}
	@Nullable 
	public TimerAction getCurrentAction () {
		return currentAction;
	}
	public String getName() {
		return name;
	}
}
public interface TimerChanged {
	public void changed(TimerSequence sequence);
}
rukez
()
Ответ на: комментарий от rukez

спасибо rukez правда в яве не силен но потестирую

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