Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Как программно создать таймер?

08.03.2020, 22:17. Показов 4055. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перепробовал уже много всяких вариантов (с New и без New) и никак не получается
В интернете постоянно подсовывают варианты из VB.NET.

Вот варианты, которые пробовал и ещё много других:
Visual Basic
1
2
3
4
Sub Main()
    Dim Timer1 As Timer
    Set Timer1 = Timer
End Sub
Visual Basic
1
2
3
Sub Main()
    Dim Timer1 As New Timer
End Sub
Visual Basic
1
2
3
4
Sub Main()
    Dim Timer1 As Control
    Set Timer1 = Timer
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.03.2020, 22:17
Ответы с готовыми решениями:

Как создать долгосрочный таймер?
как создать таймер чтобы прога после (к примеру 20 апреля 2003 году)неработала

Как создать таймер без формы в модуле класса?
Я пытаюсь создать таймер в модуле класса на VB5. Пишем в секции General Public WithEvents tmr As Timer Описывывем событие tmr_Timer()...

Как программно создать обьект в VB?
Как програмно создать обьект в VB,например Label?

31
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
09.03.2020, 08:57
Цитата Сообщение от Power_Basic Посмотреть сообщение
Перепробовал уже много всяких вариантов (с New и без New) и никак не получается
Для переносимости программы лучше сделать на API.
Модуль:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
Public Declare Function SetTimer Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long
 
Public Declare Function KillTimer Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long) As Long
Public Interval As Integer
 
 
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal nIDEvent As Long, ByVal dwTime As Long)
Call Form1.MyJob             'К сожалению, Sub TimerProc должна находиться в модуле. Приходится извращаться
End Sub
2
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
09.03.2020, 13:17  [ТС]
Цитата Сообщение от Argus19 Посмотреть сообщение
Для переносимости программы лучше сделать на API.
Цитата Сообщение от Argus19 Посмотреть сообщение
Visual Basic
1
Call Form1.MyJob
К сожалению, Sub TimerProc должна находиться в модуле. Приходится извращаться
Ну в принципе, я на API-то и собирался таймер сделать, прочитав второй пост из второй ветки из тех, которые перечислены ниже по странице в качестве "похожих тем", но, признаюсь, не ожидал, что и здесь тоже будут подводные камни.

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

Одним словом, напишу на Power Basic'е, поскольку там для создания таймера программно нет никаких проблем. Хотя, если по правде, сейчас-то я уже научился это делать, а вот первое время мне и на VBA Excel, и на Power Basic'е всегда не хватало именно таймера, поскольку там нет такой удобной контрольки на панели инструментов

Таймер - это последнее недостающее звено для одной небольшой утилитки, которую решил сделать для себя в процессе обсуждения вот этой темы: Как программно определить текущую раскладку клавиатуры?

Как выяснилось, всё задуманное удобней сделать именно на API, а теперь ещё и таймер на API тоже. Ну и получается, необходимость в визуалиации полностью отпала
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.03.2020, 14:55
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

Цитата Сообщение от Power_Basic Посмотреть сообщение
Получается, что для создания таймера нужна форма, а замысел-то как раз и был в том, чтобы обойтись совсем без форм.
Зачем форма для API таймера?
Ладно, вот готовый код. Ну почти, для полного кайфа нужен ещё механизм выхода из этой программы. Тут нет окна и работает она скрытно. Удаляется в диспетчере задач. Индикатор раскладки будет ScrollLock/
Нужно создать проект без формы, её удаляем сразу. Добавляем вот этот модуль bas файл. В настройках проекта запуск с процедуры Main.
Visual Basic
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
 Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long
Declare Function GetForegroundWindow Lib "user32" () As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
Const VK_SCROLL = &H91
Const KEYEVENTF_KEYUP = &H2
Sub Main()
Dim x
MsgBox "Timer On"
SetTimer 0, 0, 200, AddressOf TimerProc
Do While x = 0
DoEvents
Sleep 200
Loop
End Sub
Sub Scroll_LockOnOff()
  Call keybd_event(VK_SCROLL, 0, 0, 0)
  Call keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0)
End Sub
 
Sub TimerProc()
Win = GetForegroundWindow         ' Получаем активное окно.
Thread = GetWindowThreadProcessId(Win, 0) ' Получаем поток активного окна.
 
R = GetKeyboardLayout(Thread)
' раскладка EN индикатор не горит
If R = 67699721 And GetKeyState(VK_SCROLL) > 0 Then Scroll_LockOnOff
' раскладка RU индикатор  горит
If R <> 67699721 And GetKeyState(VK_SCROLL) = 0 Then Scroll_LockOnOff
End Sub
Можно всё то же самое сделать с окошком штатным Таймером, часами, раскладка буквами, как ты хотел изначально.
Тогда модуль формы не нужен, всё будет в frm.
Не вижу ни каких ограничений!
2
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
09.03.2020, 19:44  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Зачем форма для API таймера?
Ну дык и я же тоже изначально думал, что не нужна, и я легко обойдусь совсем без форм, но Argus19 ввёл меня в заблуждение своим комментом Говорит "Приходится извращаться" Ну вот я и воспринял это как сигнал того, что там куча проблем на дороге будет

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ладно, вот готовый код.
Спасибо, попробовал, работает исправно. Как говорится, то что доктор прописал


Цитата Сообщение от Pro_grammer Посмотреть сообщение
для полного кайфа нужен ещё механизм выхода из этой программы.
А вот механизм выхода как раз-таки и не нужен!
Задумано так, что эта утилита будет всегда стартовать вместе с операционной системой в режиме автозапуска, ну и "отключаться", соответственно, тоже будет вместе с операционкой. Полная, автоматизация, одним словом

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Можно всё то же самое сделать с окошком штатным Таймером, часами, раскладка буквами, как ты хотел изначально.
Не, теперь у меня планы уже изменились
Теперь, когда я узнал про возможность сигнализировать о текущей раскладке лампочкой, необходимость в визуальном отображении раскладки на экране отпала, ну и необходимость в этом окошке, получается, тоже отпала. Лампочка гораздо удобнее, да и места совсем не занимает.

Одним словом, плавающее окно в стиле TopMost было нужно главным образом именно для того, чтобы показывать текущую раскладку, ну а время, - это как бы просто для напоминания самому себе, что на это окошко всегда можно вывести любую информацию. А само по себе время постоянно перед глазами, по большому счёту, не нужно. Хотя возможно в будущем я ещё вернусь к этой идее, если появятся мысли о том, какую именно важную информацию следует оперативно выводить на экран.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.03.2020, 22:28
Для использования таймера нужен цикл прокачки сообщений. Также если в перерывах между тиками ничего делать не нужно, то сойдет вообще цикл со Sleep. Но все-равно правильней делать через цикл прокачки сообщений. Так можно легко организовать правильный выход из программы.
1
Эксперт по электронике
6558 / 3185 / 335
Регистрация: 28.10.2011
Сообщений: 12,461
Записей в блоге: 7
14.03.2020, 00:16
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Зачем форма для API таймера?
Нужна. Точнее нужен обработчик событий окна, иначе не работает.
PureBasic
1
2
3
4
5
6
7
Procedure Proc(hwnd, uMsg, idEvent, dwTime)
  Debug dwTime
EndProcedure
 
SetTimer_(0, 0, 1000, @Proc())
 
Delay(10000)
Если будет окно с обработчиком (пусть таймер даже с ним не связан), тогда таймер начинает работать.
PureBasic
1
2
3
4
5
6
7
Procedure Proc(hwnd, uMsg, idEvent, dwTime)
  Debug dwTime
EndProcedure
 
SetTimer_(0, 0, 1000, @Proc())
 
MessageBox_(0, "","", 0)
Цитата Сообщение от The trick Посмотреть сообщение
сойдет вообще цикл со Sleep.
Таймер не работает. Выше код с функцией Delay, которая по сути Sleep.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.03.2020, 05:46
Цитата Сообщение от locm Посмотреть сообщение
Нужна. Точнее нужен обработчик событий окна, иначе не работает.
А это что тогда?
Цитата Сообщение от Power_Basic Посмотреть сообщение
Спасибо, попробовал, работает исправно. Как говорится, то что доктор прописал
Вообще то я выложил полностью рабочий код. Формы в приложении нет, всё работает как задумано. Можно проверить
1
Эксперт по электронике
6558 / 3185 / 335
Регистрация: 28.10.2011
Сообщений: 12,461
Записей в блоге: 7
14.03.2020, 12:44
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А это что тогда?
Это DoEvents в VB коде. Попробуйте убрать его.
Нужно не окно, а обработчик событий.
PureBasic
1
2
3
4
5
6
7
8
9
10
Procedure Proc(hwnd, uMsg, idEvent, dwTime)
  Debug dwTime
EndProcedure
 
SetTimer_(0, 0, 1000, @Proc())
 
While GetMessage_(msg.MSG, #Null, 0, 0) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg) 
Wend
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Вообще то я выложил полностью рабочий код.
Я тоже выложил код. Можете запустить и проверить.
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
14.03.2020, 13:00
SetTimer
Type: TIMERPROC
A pointer to the function to be notified when the time-out value elapses. For more information about the function, see TimerProc. If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.03.2020, 14:41
Цитата Сообщение от locm Посмотреть сообщение
Это DoEvents в VB коде. Попробуйте убрать его.
зачем?
Разговор был про форму, и я её убрал.

Цитата Сообщение от locm Посмотреть сообщение
Сообщение от Pro_grammer
Зачем форма для API таймера?
Нужна.
Цитата Сообщение от locm Посмотреть сообщение
Нужно не окно
Вы уж разберитесь, для себя лично, нужна форма или нет?
Я говорю, что форма не нужна и написал приложение без формы. А про обработчик событий, так это любому дебилу нормальному программисту понятно. Иначе зачем таймер, если от него события не обрабатывать?
0
Эксперт по электронике
6558 / 3185 / 335
Регистрация: 28.10.2011
Сообщений: 12,461
Записей в блоге: 7
14.03.2020, 14:48
Я написал.
Цитата Сообщение от locm Посмотреть сообщение
Нужна. Точнее нужен обработчик событий окна, иначе не работает.
А вы перевернули все с ног наголову!
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.03.2020, 15:02
Цитата Сообщение от locm Посмотреть сообщение
обработчик событий окна
Хорошо, про какое окно идет речь, если нет его в моём приложении от слова совсем?
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
14.03.2020, 15:16  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А это что тогда?
Цитата Сообщение от Power_Basic
Спасибо, попробовал, работает исправно. Как говорится, то что доктор прописал
Вообще то я выложил полностью рабочий код. Формы в приложении нет, всё работает как задумано. Можно проверить
Справедливости ради должен сказать, что уже после того поста я полностью отказался от идеи использовать таймер без окна, поскольку неожиданно для самого себя заметил, что этот бесконечный цикл ну очень сильно грузит процессор практически на пустом месте (см. скриншот). И ведь это будет продолжаться не какой-то короткий промежуток времени, а в течении всей работы компьютера.
Сейчас я остановился на том варианте, что окно всё-таки будет, но поскольку оно теперь мне для информационных целей не нужно вовсе (после ознакомления с идеей индикации раскладки лампочкой) и будет только "мешаться под ногами", оно будет либо невидимым, либо будет иметь отрицательные координаты. Иными словами, это будет привычный нам всем таймер с привычным нам всем (но невидимым) окном
Миниатюры
Как программно создать таймер?  
0
Эксперт по электронике
6558 / 3185 / 335
Регистрация: 28.10.2011
Сообщений: 12,461
Записей в блоге: 7
14.03.2020, 15:51
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Хорошо, про какое окно идет речь
Я же написал
Цитата Сообщение от locm Посмотреть сообщение
Точнее нужен обработчик событий окна, иначе не работает.
Что из этого не понятно? Я же уточнил что нужен обработчик событий. Если не согласны, уберите DoEvents из кода и посмотрите что получится.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.03.2020, 17:32
Цитата Сообщение от locm Посмотреть сообщение
Что из этого не понятно?
Не понятно, про какое окно тут идёт речь:
Цитата Сообщение от locm Посмотреть сообщение
Точнее нужен обработчик событий окна, иначе не работает.
Цитата Сообщение от locm Посмотреть сообщение
уберите DoEvents из кода
Зачем?
DoEvents передает управление операционной системе. Прекрасно работает без окна

Добавлено через 2 минуты
Цитата Сообщение от Power_Basic Посмотреть сообщение
что этот бесконечный цикл ну очень сильно грузит процессор практически на пустом месте (см. скриншот). И ведь это будет продолжаться не какой-то короткий промежуток времени, а в течении всей работы компьютера.
Зря не спросили.
Там всего то и надо добавить Sleep в цикл.
это в шапку деклараций:
Visual Basic
1
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Это в код цикла
Visual Basic
1
2
3
4
Do While x = 0
DoEvents
Sleep 200
Loop
И процессор больше не грузит.
1
Эксперт по электронике
6558 / 3185 / 335
Регистрация: 28.10.2011
Сообщений: 12,461
Записей в блоге: 7
14.03.2020, 18:01
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не понятно, про какое окно тут идёт речь:
Я где-то писал про окно? Я писал что обработчик оконных событий. Читайте внимательно.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
14.03.2020, 18:03
Цитата Сообщение от locm Посмотреть сообщение
Таймер не работает. Выше код с функцией Delay, которая по сути Sleep.
А зачем тогда таймер если будет Sleep? Цикл и будет с таймингом.

Цитата Сообщение от Power_Basic Посмотреть сообщение
Справедливости ради должен сказать, что уже после того поста я полностью отказался от идеи использовать таймер без окна, поскольку неожиданно для самого себя заметил, что этот бесконечный цикл ну очень сильно грузит процессор практически на пустом месте (см. скриншот). И ведь это будет продолжаться не какой-то короткий промежуток времени, а в течении всей работы компьютера.
Поэтому я и написал нужен цикл прокачки сообщений который не будет грузить поток.

DoEvents - это не очень хороший способ прокачки сообщений поскольку он не ждет сообщения а сразу же возвращает управление, помимо этого DoEvents делает другую работу, которая не связана с циклом обработки сообщений.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
14.03.2020, 18:44
Цитата Сообщение от locm Посмотреть сообщение
Я где-то писал про окно?
Вы написали, что нужна форма.
Слово "Нужна." как понимать?

Цитата Сообщение от locm Посмотреть сообщение
Сообщение от Pro_grammer
Зачем форма для API таймера?
Нужна. Точнее нужен обработчик событий окна, иначе не работает.
Вот и напишите внятно и членораздельно, что я прав. Форма при работе с API таймером не нужна.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
14.03.2020, 19:21  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Зря не спросили.
Там всего то и надо добавить Sleep в цикл.
это в шапку деклараций:

Visual Basic
1
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Это в код цикла

Visual Basic
1
2
3
4
Do While x = 0
DoEvents
Sleep 200
Loop
И процессор больше не грузит.
Да, действительно, подтверждаю. В такой редакции процессор не грузится совсем (см. скриншот), а функционал от этого нисколько не ухудшается. Лампочка загорается и гаснет всё также мгновенно, практически.
Ну значит всё-таки можно будет обойтись без "окна за кулисами" и это приятно

Цитата Сообщение от The trick
Поэтому я и написал нужен цикл прокачки сообщений который не будет грузить поток.
Не, ну если бы я был таким профессионалом, что мог запроста воспринимать на слух такие сложные словесные формулы "цикл прокачки сообщений который не будет грузить поток", тогда бы я вообще никому не задавал никаких вопросов на этом форуме
Миниатюры
Как программно создать таймер?  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2020, 19:21
Помогаю со студенческими работами здесь

Как программно создать DSN?
Или подскажите как быть после того, как я создам дистрибутив, мне что DSN вручную прописывать на каждом компе?

Как программно создать 10 лабелов?
как программно создать 10 лабелов...?

Как программно создать файл .xls???
Можт кто знает как из VB создать *.xls??? черканите...

Как программно создать контрол UserControl?
Dim Path as string, I as object Path = &quot;VB.CommandButton&quot; Set I = Me.Controls.Add(Path, &quot;NewButton1&quot;) I.Visible = true Этот код...

Как создать базу на ADO программно?
где смотрел везде для DAO написано. Подскажите, где посмотреть.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru