Как передать в SetTimer имя запускаемой программы?

Программирование на Visual Basic for Applications
Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Как передать в SetTimer имя запускаемой программы?

Сообщение Mikhail » 01.02.2007 (Чт) 20:53

Имеем:
......
Public Sub StartTimer()
lngID = SetTimer(0, 0, 500, AddressOf TimeProc)
End Sub

Private Sub TimerProc( _
ByVal hwnd As Long, _
ByVal lngMsg As Long, _
ByVal lngID As Long, _
ByVal lngTime As Long)
......
End Sub

Все хорошо, только надо запускать до десятка разных программ в разное время с разной периодичностью.Как передать в SetTimer имя вызываемой программы?
Сами мы не местные (в смысле не программист), поэтому прошу ногами не бить, если вопрос глупый:)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.02.2007 (Чт) 22:09

Для запуска программ в разное время с разной периодичностью есть нормальные средства а-ля application.ontime.
Если очень хочется через settimer, то ровно так же, путём создания нескольких процедур timerproc с разными именами.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 01.02.2007 (Чт) 22:27

Как в OnTime сделать периодичность 250мсек?
,
GSerg писал(а):... путём создания нескольких процедур timerproc с разными именами.

И для каждой процедуры отдельная строка SetTimer с именем процедуры? Или можно как нибудь передать в SetTimer имя процедуры?
Об этом вопрос...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.02.2007 (Чт) 22:45

AddressOf TimeProc - это что по-твоему? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 01.02.2007 (Чт) 23:32

GSerg писал(а):AddressOf TimeProc - это что по-твоему? :roll:

Слушай, наверное ты очень умный, но я ведь и не спорю!
Я то ведь сказал, что не программист, и в первом посте спросил:
Как передать в SetTimer имя вызываемой программы?
Если знаешь, то скажи пожалуйста!
С уважением,
Михаил

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.02.2007 (Пт) 8:12

Я что-то не понял, у автора настолько все запущено, или ответы принципиально не читаются?

AddressOf TimeProc - это и есть передача в таймер имени запускаемой проги (функции то бишь). Что еще то надо?
Весь мир матрица, а мы в нем потоки байтов!

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 02.02.2007 (Пт) 15:19

Автор безусловно не в теме, чего и не скрываю, но ответы я читаю.
Попробую задать вопрос еще раз:
Есть 10 Callback ф-ций: Prog1, Prog2,...Prog10.
Так я должен 10 раз написать вызовы таймера?
ngID1 = SetTimer(0, 0, 250, AddressOf Prog1)
ngID2 = SetTimer(0, 0, 250, AddressOf Prog2)
.....
ngID10 = SetTimer(0, 0, 250, AddressOf Prog10) ?

Или можно написать один вызов
ngID = SetTimer(0, 0, 250, AddressOf TimeProc)
и вместо TimeProc передавать туда нужное мне имя Функции?
Как передавать? Чего надо написать перед вызовом SetTimer?

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

Сообщение alibek » 02.02.2007 (Пт) 15:43

Какой смысл использовать десять одинаковых таймеров? Можно обойтись одним.
Кроме того, в приложении может использоваться ограниченное число таймеров, не то 8, не то 15.
Lasciate ogni speranza, voi ch'entrate.

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 02.02.2007 (Пт) 15:55

alibek писал(а):Какой смысл использовать десять одинаковых таймеров? Можно обойтись одним.
Кроме того, в приложении может использоваться ограниченное число таймеров, не то 8, не то 15.

Они не одинаковые!!! Они вызывают разные функции с разной периодичностью!
И я в третий раз спрашиваю: Как обойтись одним вызовом таймера в тексте программы, передавая ему имя вызываемой функции? Какой код
надо для этого написать?
Пусть их(вызовов таймера с разными CallBack функциями) будет 8, а не 10, или хотя бы 2

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

Сообщение alibek » 02.02.2007 (Пт) 15:59

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

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 02.02.2007 (Пт) 17:09

Но для того, чтобы быть программистом думать обязательно:)
Какие проверки наступления события? Ты о чем?
Надо по таймеру запускать разные(!) программы. Как таймеру сообщить какую программу запускать, ограничившись при этом одним вызовом таймера в тексте программы?
А по какому событию? Как проверять условия, где проверять? - про это я не спрашивал...
У-ф-ф! Четвертый раз повторяю вопрос! Обещаю, что последний.

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

Сообщение alibek » 02.02.2007 (Пт) 17:13

1. Таймер срабатывает с определенной периодичностью.
2. Проверяешь, прошло ли достаточно времени, чтобы запустить программу 1.
2.1. Если прошло, запускаешь программу 1, сбрасываешь соответствующий счетчик.
2.2. Если нет, увеличиваешь счетчик на интервал таймера.
3. Проверяешь, прошло ли достаточно времени, чтобы запускать программу 2.
3.1. Если прошло, запускаешь программу 2, сбрасываешь соответствующий счетчик.
3.2. Если нет, увеличиваешь счетчик на интервал таймера.
...
Повторяешь нужное число раз.
Lasciate ogni speranza, voi ch'entrate.

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 02.02.2007 (Пт) 18:59

alibek писал(а):1. Таймер срабатывает с определенной периодичностью.

Чистая правда!
Все остальное, к сожалению, "не в тему"

API ф-ция SetTimer(0, 0, 250, AddressOf TimeProc) создает таймер и
запускает программу TimeProc c периодичностью 250мсек.
Т.е. в моей программе есть строка
ngID = SetTimer(0, 0, 250, AddressOf TimeProc)
(ngID - идентификатор таймера, который позволяет его убить и остановить TimeProc)
Слова может не совсем правильные, но смысл таков и в тесте это все работает.
Теперь, при следующем обращении к этой-же функции я хочу запустить другую программу! Не TimeProc, а TimeProc2 .
Естественно при этом создастся другой таймер, с другим идентификатором.
По разным причинам я не хочу заводить в тексте новую строку кода
ngID2 = SetTimer(0, 0, 250, AddressOf TimeProc2),
а для того, чтобы обойтись одной строкой обращения к функции SetTimer, видимо, надо завести какую-то переменную и присвоить ей предварительно нужное значение, типа
a=AddressOf TimeProc2
и в обращении к SetTimer использовать эту переменную. Ну например так:
ngID = SetTimer(0, 0, 250, a)
Можно так сделать? И как описать эту переменную и присвоить ей значение? Этого я не знаю, поэтому и спрашиваю
P.S. Sorry, но задал вопрос еще раз, пятый. Хотя и не понимаю что было неясно в первоначальной формулировке.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.02.2007 (Сб) 7:29

Есть предложение автору описать не то, что он пытется сделать с таймером, а то, что ему надо в конечном итоге. А то, что-то мы тут "моя твоя не понимай".
Я так понял, что автору надо следующее: срабатывает таймер - запускается прога номер раз, в следующее срабатывание таймера - прога номер два, далее третья. То есть интервал один, а проги запускаются по очереди. Это вполне можно сделать одним таймером с одной функцией, которая внутри себя имела бы некий счетчик, увеличивающийся при каждом срабатывании таймера и в зависимости от величины счетчика запускала бы нужную прогу.

Если же ситуация другая, то и решение будет другим
Весь мир матрица, а мы в нем потоки байтов!

Mikhail
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 31.07.2006 (Пн) 18:53

Сообщение Mikhail » 03.02.2007 (Сб) 20:12

Приятно читать конструктивный текст!
Серьезно!
А по существу:
Есть головная программа, которая по наступлению каких-то событий (не временных!) запускает разные программы, общим числом 8-10 штук. Причем запускает их не одновременно, а для каждой проги свое событие.
Далее каждая из этих дочерних программ должна повторяться с интервалом 250 мсек (миллисекунд!), хотя в некоторых случаях эта цифра в процессе работы тоже может меняться, до тех пор, пока Main по наступлению каких-то других событий не будет их останавливать.
Т.е. принципиальных-то проблем нет. Можно естественно ограничиьься и одним таймером, понимающим миллисекунды. Но тогда придется внутри головной программы заводить бодягу с подсчетом тиков для каждой дочерней программы. По моему SetTimer и KillTimer получается гораздо проще. И быстрее, а скорость является критичной.
Но есть маленькая неприятнось. Дело в том, что завтра этих дочерних программ будет опять 8-10, но других. А послезавтра опять других. И всего их может быть много десятков или даже сотен. Так вот хотелось бы избежать ежедневной правки текста (даже 10 строчек), тех самых вызовов SetTimer с именем вызываемой программы, т.к. рано или поздно будет допущена ошибка, а это чревато...

Первоначальный вопрос - снимаю. В связи с отрицательным ответом.
Оказывается в VBA нельзя значение AddressOf присвоить переменной. Так решил за нас Майкрософт. Сведения, правда, не из первоисточника, а из какой-то западной статьи, но похоже на правду.
Если будут какие-нибудь путние идеи - приму с благодарностью.

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

Сообщение alibek » 03.02.2007 (Сб) 22:00

Код: Выделить всё
Function FnPtr(ByVal Ptr As Long) As Long
FnPtr = Ptr
End Function
...
F1 = FnPtr(AddressOf Proc1)
Lasciate ogni speranza, voi ch'entrate.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 03.02.2007 (Сб) 22:02

alibek
Зачем писать свою FnPtr если есть замечательная функция Val?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 03.02.2007 (Сб) 22:25

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


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот, Mail.ru [бот] и гости: 89

    TopList