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 ★★★★
()
Ответ на: комментарий от dimuska139

Обрати внимание я ответил на твое сообщение вообще то.

Но если ты вообще забыл, то забей и не вспоминай.

XoFfiCEr ★★☆☆
() автор топика
Последнее исправление: XoFfiCEr (всего исправлений: 1)
Ответ на: комментарий от 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 ★★☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.