|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
В процедуре используется установка таймера API функцией SetTimer. В первом варианте процедура ActivateTimer отрабатывает без ошибок, функция SetTimer использует фактическое имя процедуры, запускаемой таймером (TimerProc). Код: vbnet 1. 2. 3.
Во втором варианте при попытке передать в процедуру ActivateTimer в качестве параметра ProcName имя процедуры, запускаемой таймером (TimerProc), выдается ошибка : "Expected Sub, Function, or Property." Код: vbnet 1. 2. 3.
Каким образом реализовать второй вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2012, 11:06 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Каким образом реализовать второй вариант?Реализовать первый вариант, а разблюдовку по ProcName делать внутри TimerProc. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2012, 11:36 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Antonariy, Если я верно понимаю, нужно в TimerProc передавать параметром ProcName имя запускаемой таймером процедуры и внутри TimerProc осуществлять вызов через Case? Как правильно передать параметр ProcName или его нужно объявлять как Public? Подойдет ли предложенное Вами решение, если делать класс для работы с таймером, а на его основе класс собственной коллекции таймеров? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 12:08 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Параметром таймера можно делать лишь Long-число. Через него можно передать указатель на объект, у которого вызвать ProcName. Можно такие объекты сделать наследниками одного интерфейса, чтобы не было ошибок вызова. Никаких case'ов, это вредно для архитектуры. SnowblastПодойдет ли предложенное Вами решение, если делать класс для работы с таймером, а на его основе класс собственной коллекции таймеров?Только оно для этого и подойдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 12:55 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Snowblast, в общем-то, Antonariy методику рассказал. Слегка корявая реализация (для VBA) ниже. Класс с незатейливым названием Timer (в VB можно переименовать, чтобы избежать путаницы) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103.
модуль Код: vbnet 1. 2. 3. 4. 5. 6.
Использование на месте, как у стандартного VB-шного таймера: Код: vbnet 1. 2. 3. 4. 5.
Насчёт коллекции - можно и коллекцию, по образу 8197167 , но надо ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2012, 13:17 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
13-й квартал, Спасибо за пример. Адаптировал, все работает. Тем не менее прошу Вашего комментария. В объявлении функций SetTimer, KillTimer и процедуры ProcName параметр idEvent as Long заменен на idEvent as Timer - это и есть передача указателя на объект? Какие преимущества при реализации через Friend-метод, как в Вашем примере, или через интерфейсный класс? Ниже рабочий вариант на базе Вашего примера, реализованный через CallByName. В классе Timer из Вашего примера: - объявляется свойство ProcName as String, содержащее имя процедуры, запускаемой таймером (TimerSub1, TimerSub2) - использование Event и WM_TIMER_Notify не требуется. В классе TimerAction размещаются процедуры, запускаемые таймером: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
В модуле: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
P.S. В Вашем примере при объявлении процедуры KillTimer, ее тип, видимо, подразумевался как Long, а не BOOL. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2012, 11:07 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
SnowblastВ объявлении функций SetTimer, KillTimer и процедуры ProcName параметр idEvent as Long заменен на idEvent as Timer - это и есть передача указателя на объект?Да. SnowblastКакие преимущества при реализации через Friend-метод, как в Вашем примере, или через интерфейсный класс?Плюсы реализации через Friend-метод: не создаётся лишней сущности (интерфейсного класса) на уровне проекта; такая реализация хороша, если VBA-проект является библиотечным (например, создаётся ActiveX DLL, которая будет подключаться в дальнейших проектах). Поскольку Friend-методы не видны за пределами VBA-проекта, из библиотеки ничего лишнего (зачем клиенту знать, что у класса есть метод-"потайная дверь", который вызывается только из одного, не контролируемого притом клиентом, места?) не "торчит". Плюсы реализации через интерфейсный класс: из класса ничего не "торчит" уже на уровне проекта, только Public-методы/свойства. Случайно написать код, входящий в "потайную дверь", маловероятно, нужно знать, что класс реализует интерфейс, да ещё получить ссылку на этот интерфейс; больший универсализм - годится для любого вида проекта. SnowblastНиже рабочий вариант на базе Вашего примера, реализованный через CallByName. В классе Timer из Вашего примера: - объявляется свойство ProcName as String, содержащее имя процедуры, запускаемой таймером (TimerSub1, TimerSub2) - использование Event и WM_TIMER_Notify не требуется. В классе TimerAction размещаются процедуры, запускаемые таймером: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
В модуле: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вроде всё и гладко, но не нравится по нескольким причинам сразу. Кроме того, выполняемая при каждом вызове диспетчеризация через CallByName содержит в себе скрытый Select Case по именам методов, время выполнения которого зависит от количества методов, и скрытые циклы в операции сравнения имён методов со строковыми константами, время выполнения которых зависит от длин строк. Думаю, что возможна диспетчеризация за O(1), т. е. за константное время, если опишите задачу подробнее (и согласитесь на некоторый отход от имеющегося видения решения, скорее всего). SnowblastP.S. В Вашем примере при объявлении процедуры KillTimer, ее тип, видимо, подразумевался как Long, а не BOOL.Я предпочитаю следовать первоисточнику . Это непринципиально, поскольку перечислимые типы в VB приводятся к Long, но и автоматом получать "плюшки" от IDE приятно, и код читабельнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.11.2012, 03:05 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Всем спасибо за участие. Разобрался. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:53 |
|
Параметры API SetTimer
|
|||
---|---|---|---|
#18+
Идея Set Timer сама по себе хороша, но для того чтоб не балела даром голова, нужно отлаживать на форме.таймер и если будет обеспечен обход каких-либо ошибок и не будет доработок в этом месте, можно переписать код на Set Timer (event). Если сразу работать с event Timer заявленым, то програма останавливается при ошибке не на паузу а вылетает без сохраниения ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2012, 12:31 |
|
|
start [/forum/topic.php?fid=60&msg=38031763&tid=2157329]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 393ms |
0 / 0 |