Событие по времени

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Событие по времени

Сообщение kminas » 10.04.2008 (Чт) 15:35

Даже не знаю как написать тему. Как написать процедуру, которая запускалась бы, скажем в 9.00, но, если, программа не запущена, то позже. Пример: перевод часов компьютера на летнее (зимнее) время. Когда бы ни был включен компьютер (хоть через месяц) после наступления часа Х, время все равно переведется, причем только 1 раз. Что-то сам не могу сообразить. :roll:
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.04.2008 (Чт) 16:17

Процедуру может вызвать исключительно другая процедура. Процедура не может вызваться просто так из ниоткуда.

Поэтому, отвечая на вопрос:
Как написать процедуру, которая запускалась бы

можно сказать - никак (если только речь не идёт о рекурсии; а речь не о ней).

Если отбросить теорию, то на практике в Windows задача решается следующим образом:

-->Кто-то должен инициировать запуск процедуры.
Это может быть например новый процесс, новый поток или что-то ещё. Это может быть реакцией на событие, на сообщение.

Т.е. может быть запущен процесс, ожидающий наступление нужного времени. Может быть добавлена запись в виндовый планировщик. И т.п.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.04.2008 (Чт) 16:23

Конкретно переход на зимнее/летнее время в Windows решается совсем иначе.
Просто ставится флажок.
Lasciate ogni speranza, voi ch'entrate.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 16:57

alibek писал(а):Конкретно переход на зимнее/летнее время в Windows решается совсем иначе.
Просто ставится флажок.

Ну, я ж не совсем тупой. Флажок это ставлю я, а программу пишет МелкоСофт
Константин

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 17:15

Хакер писал(а):Процедуру может вызвать исключительно другая процедура. Процедура не может вызваться просто так из ниоткуда.

-->Кто-то должен инициировать запуск процедуры.

Видно ты меня не совсем понял? Пользователь, запуская программу или совершая в ней какие-либо действия и запускает некие процедуры в которые и можно встроить код. Скажем
Код: Выделить всё
MyDate = Date
If Date = #4/10/2008# Then
MsgBox "Иди в баню" vbYes
ElseIf Date = #4/20/2008# Then
Call cmdTralyalya_Click
end if

Если программа запущена 10.04.08 то работает первое условие, если 20.04.08 то будет работать второе, а мне нужно, чтобы 11 апреля сработало первое условие. Это наверно, сейчас думаю, сложновато будет.
Но то же по времени будет, наверно полегче. Программа запущена, но не активна. Как в этом случае с условием задать время с возможностью отложенного срабатывания?[/quote][/code]
Последний раз редактировалось kminas 10.04.2008 (Чт) 22:30, всего редактировалось 2 раз(а).
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.04.2008 (Чт) 17:17

1) Я тебя прекрасно понял и прекрасно объяснил пути решения.
2) Нефиг плодить одни и те же постинги.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 17:22

Но ты мне не ответил? Мне нужна команда или ее нет?
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.04.2008 (Чт) 17:31

ЦСК тебе команда. :x

Во-первых, ЯВУ настолько ВУ, что в них инструкции деляется на некоторое число видов, а не представляют собой одни лишь команды.

Во-вторых, я тебе доходчиво (кажется), объяснил, что ты неверно представляешь себе принцип. Нет и не может быть (и не будет ни в одном языке) "команды", как ты говоришь, которая позволила бы установить время, в которое "некое абстрактное существо" вызовет твою процедуру.

Процедура вызывается исключительно кодом. Либо кодом другой процедуры, либо просто кодом (в общем случае).

Просто кодом задачи (есть такая сущность с точки зрения процессора). Код задачи выполняется непрерывно, от рождения задачи до её уничтожения, а не тогда, когда программисту kminas'у захочется его выполнить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 18:51

Вот я и хочу ее запустить во время выполнения другой процедуры!
Константин

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.04.2008 (Чт) 19:00

В один момент времени выполняется только одна процедура. Это основа основ, о которой поголовно никто из начинающих не знают.

Две процедуры могут работать одновременно только если: 1) они в разных потоках и 2) работают под управлением многоядерного процессора.

Во всех остальных случаях в один момент времени выполняется только лишь одно процедура.

Псевдо-одновременно могут выполняться несколько процедур из разных потоков. Однако это не то, что тебя интересует.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 21:09

Нет не одновременно. У меня они и так выполняются одна за другой, но при нажатии, скажем CommandButton1, вызывается процедура Call cmdX, а в ней говорится, что если время 10.00, то привет Вася, а, если 12.00, прощай Федя. Так вот мне надо сделать, в т.ч. и так, чтобы, если этот гнусный Федя сачковал где-то и или чесал в затылке или нажимал кнопки, но не эту, а нажал ее в 12.10 или в 12.30, то его и послали бы в 12.30. Вот в этом и вопрос.
Константин

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 10.04.2008 (Чт) 21:23

kminas
Раздели свою задачу на две части:

Как написать процедуру, которая запускалась бы, скажем в 9.00,

Здесь я просто не знаю, как

но, если, программа не запущена, то позже.
А вот это как раз совсем просто. Если ты совершил нужное событие, ставь флажок, что совершил (в реестр или в файл). При запуске программы проверяй: время икс уже прошло, а флажок не установлен - совершай событие и ставь флажок. Время икс ещё не пришло - возвращаемся к пункту 1 (ответ на который я не знаю).

Собстенно, alibek тебе про такой флажок говорил (а не про тот, который мышкой ставится).

Хакер А если без абстрактных рассуждений про всякоразнопоточность - как конкретно заставить программу запуститься в нужное время? Есть же программы, которые даже компьютер включают из спящего режима. Как они это делают?

[/quote]
Артур
 
   

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 10.04.2008 (Чт) 21:56

arthur2 писал(а):kminas
Раздели свою задачу на две части:

Как написать процедуру, которая запускалась бы, скажем в 9.00,

Здесь я просто не знаю, как

но, если, программа не запущена, то позже.
А вот это как раз совсем просто. Если ты совершил нужное событие, ставь флажок, что совершил (в реестр или в файл). При запуске программы проверяй: время икс уже прошло, а флажок не установлен - совершай событие и ставь флажок. Время икс ещё не пришло - возвращаемся к пункту 1 (ответ на который я не знаю).

Собстенно, alibek тебе про такой флажок говорил (а не про тот, который мышкой ставится).


Я, честно говоря, не знаю про этот флажок. И вообще, я думаю, что это несколько сложновато для той задачи, которую я поставил. А о процедуре, которая запускалась бы в 9.00 это проще. Не она сама запускалась бы, а как совершенно правильно и умно говорит Хакер процедуры могут идти одна за другой. Я предположил, что если бы в 9.00 кто-нибудь нажал бы какую-то кнопку (или какие-то) из которых процедура может быть вызвана, то процедура бы запустилась. Более того я задавал период с 9.00 до 9.05 и ставил цикл Do ... Loop. и счетчик на 1 раз, но, при каждом нажатии процедура запускается вновь. Так что запустить (при работающей программе) как раз не проблема. Как прекратить ее запуски?
Ну а другой вопрос оставим на потом.
Последний раз редактировалось kminas 11.04.2008 (Пт) 9:38, всего редактировалось 1 раз.
Константин

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.04.2008 (Пт) 8:24

1. Твоя программа запускается при каждом запуске Windows (в автозагрузке), программа запускается невидимо, т.е. не отображает интерфейс.
2. Программа сравнивает текущую дату с датой события.
2.1. Если событие уже наступило, программа проверяет наличие файла i_am_just_dummy_file.dat.
2.1.1. Если такой файл есть, программа выгружается.
2.1.2. Если такого файла нет, программа создает такой файл и отображает интерфейс.
2.2. Если событие не наступило, то вычисляется разница между датой события и текущей датой.
2.3. Если эта разница больше некоего предопределенного значения (например, три дня), программа выгружается.
2.4. Если эта разница меньше некоего предопределенного значения, программа остается работать невидимо, периодически (с интервалом, например, 1 минута) возвращаясь к шагу 2.
Lasciate ogni speranza, voi ch'entrate.

kminas
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 31.10.2005 (Пн) 20:17
Откуда: Ростов-на-Дону

Сообщение kminas » 11.04.2008 (Пт) 9:34

Спасибо! Все четко и ясно.
Константин

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 11.04.2008 (Пт) 10:13

kminas
Флажок - просто пометка. Любая переменная, на основе значения которой ты делаешь то или иное действие.
Код: Выделить всё

Dim flajok As Integer
Private Sub Form_Load()

flajok = Val(GetSetting(App.EXEName, "Options", "Flag", 0))
'Если флажок стоит, значит запланировано действие
'Если сброшен, то действие или не запланировано, или уже совершено

'(естественно, не обязательно хранить его именно в реестре - можно и
' в своём файле. Можно как флажок использовать даже просто наличие или отсутсвие какого-то файла.)

If flajok = 1 Then 'запланировано, но ещё не сделано
'   проверяем, прошел ли уже момент икс
    If Now > kogda Then 'момент икс уже прошёл
'       совершаем-таки то, что надо
     doToChtoNado
'       сбрасываем флажок
      flajok = 0
     Call SaveSetting(App.EXEName, "Options", "Flag", flajok)
    End If
End If
End Sub


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

но, если, программа не запущена, то позже
я думаю, что это несколько сложновато для той задачи, которую я поставил

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


ставил цикл Do ... Loop
Не лучший способ переждать период времени. Лучше подключи таймер.

как совершенно правильно и умно говорит Хакер

Никто и не оспаривает, что всё, что он говорил, умно и правильно. Просто конкретики как-то не было.

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

А вот если нужно запустить программу в определённое время - это уже интересно. Хакер упоминул виндовский планировщик - это как-то не греет (больно он какой-то кривой). А вот и.т.д. как раз было бы интересно (но и.т.д -то как раз он и не расшифровал)

Есть же программы, которые умеют запускаться в нужное время (и даже включать компьютер при необходимости). Причём, виндовским планировщиком они не пользуются (по крайней мере, явно). А чем тогда пользуются?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 11.04.2008 (Пт) 10:20

alibek
Упс... Тут без меня появился более понятный ответ!

И всё-таки - при этом способае программа ведь не включит компьютер. А интересно было бы, как сделать, чтобы могла включить.

Да, и с флажком (файл i_am_just_dummy_file.dat) - лучше всё-таки ставить флажок, когда действие запланировано и сбрасывать, когда выполнено, а не наоборот.
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.04.2008 (Пт) 10:23

Включение компьютера по расписанию организовано совсем иначе.
Данную функцию обеспечивает BIOS компьютера.
А программа просто использует эту возможность, изменяя дату и время включения.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.04.2008 (Пт) 10:24

arthur2 писал(а):Да, и с флажком (файл i_am_just_dummy_file.dat) - лучше всё-таки ставить флажок, когда действие запланировано и сбрасывать, когда выполнено, а не наоборот.

Не лучше. Поразмышляй над алгоритмом. Данный флажок отмечает вовсе не запланированность события.
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 11.04.2008 (Пт) 18:09

alibek
Включение компьютера по расписанию организовано совсем иначе.

Ну дык... понятно, что иначе. Вопрос даже не в том, как это устроено, а в том, как это повторить. А где прописана дата и время включения, чтобы её изменить?

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

С алгоритмом - не понятно, чего я мог не понять. Перескажу своими словами. Чтобы алгоритм был полный, его надо начать не с проверки, а с назначения действия. Кстати, если как флаг использовать файл, то именно в файл можно и писать само задание!

1. назначаю задание на время икс
2. пишу в файл параметры задания.
3. пока программа не выключена, просто проверяю время от времени, а не наступило ли время икс
4. если время таки наступило, выполняю задание и снимаю флаг (убиваю файл)
5. (программу выключили)
6. (программу включили)
7. проверяю, а есть ли задание
8. если задание есть, проверяю, а не наступило ли время икс
9. продолжаю с пункта 3
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 85

    TopList