powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / медленный бесполезный таймер
22 сообщений из 22, страница 1 из 1
медленный бесполезный таймер
    #40013675
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишу простейший код в vb.net2019, где хочу показать прогресс бар, который заполнится за секунду по таймеру каждые 10мс. и обнаруживаю, что прогресс бар заполняется в полтора раза медленнее.
собрал проект, где только таймер и лейбел, в который выводятся тики, и вижу, что таймер в vb.net сильно отстаёт, в полтора раза для интервала в 1мс! что за криворукие таймеры, неужели нельзя нормально посчитать 1 мс без сторонних скачанных таймеров, сна всего приложения и горы кода?
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013676
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слишком маленький интервал, скорее всего часть тиков пропускается. Проверь набольшем интервале, тогда сможешь судить о криворукости разработчиков vb.net (а не о собственной). Ну и код приведи, конечно же.

P.S. Я в третий раз переношу тему из Visual Basic в VB.NET. Вообще-то уже можно было сообразить, где нужно задавать вопросы по VB.NET


Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013685
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот такой код работает в 16 (!!!) раз медленнее, чем должен. в лейбле должен идти отсчет каждую секунду, а идёт 16 секунд
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim tik As Long
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        tik = tik + 1
        If tik Mod 1000 = 0 Then
            Label1.Text = Str(tik / 1000)
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        tik = 0
        Label1.Text = 0
        Timer1.Interval = 1
        Timer1.Enabled = True
    End Sub

Shocker.ProПроверь набольшем интервале, тогда сможешь судить о криворукости разработчиков vb.net
- вы мне вместо килограмма картошки посчитали 16 килограммов
- это на 1 кг заметно, а если будете покупать тоннами, то нормально, с вас тысяча
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013694
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз. Таймер 1 мс слишком маленький. Тики будут пропускаться, пока идет обработка

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    tik = tik + 10
    If tik Mod 1000 = 0 Then
      Label1.Text = Str(tik / 1000)
    End If
  End Sub

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    tik = 0
    Label1.Text = 0
    Timer1.Interval = 10
    Timer1.Enabled = True
  End Sub

и всё волшебным образом теперь работает!
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013698
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но если ты еще сильнее нагрузишь обработчик тиков (если он станет работать дольше 10мс), то тики опять начнут пропускаться. Так устроена обработка таймера в WinForms (есть и другие таймеры)
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013700
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
вот такой код работает в 16 (!!!) раз медленнее
кстати, если на своей машине ты получаешь результат x16, то x10 в таймере для твой машины может оказаться маловато. У меня твой вариант кода работает в 9 раз медленнее, а не в 16.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013701
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
и всё волшебным образом теперь работает!
нет, не работает. приведенный код считает в полтора раза медленнее, чем должен. держу у уха механические часы и сравниваю тики, до чего дожили) как нормально правильно посчитать если не 1мс, то хотя бы 10мс?
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013702
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
qlewerok
вот такой код работает в 16 (!!!) раз медленнее
кстати, если на своей машине ты получаешь результат x16, то x10 в таймере для твой машины может оказаться маловато. У меня твой вариант кода работает в 9 раз медленнее, а не в 16.
угадал) но к железу или софту претензий быть не может, i5-3570k, винда 7х64, студию только вчера переустановил
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013703
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тебе нужно отмерять реально по 1мс, обычный Windows тебе не особо подойдет.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013725
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй таймер из System.Threading.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013738
fkthis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
P.S. Я в третий раз переношу тему из Visual Basic в VB.NET. Вообще-то уже можно было сообразить, где нужно задавать вопросы по VB.NET

ТСы, наверное VB уже даже не застали
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013739
fkthis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если там
qlewerok
только таймер и лейбел

то от чего же он
qlewerok
сильно отстаёт

От полета мысли, что ли?
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013752
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Попробуй таймер из System.Threading.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim tik As Long
    Private myTimer As System.Threading.Timer
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        tik = 0
        Label1.Text = 0
        Dim myCallback As New System.Threading.TimerCallback(AddressOf Task1)
        myTimer = New System.Threading.Timer(myCallback, Nothing, 0, 10)

    End Sub
    Private Sub Task1(ByVal state As Object)
        tik = tik + 1
        Label1.Invoke(Sub() Label1.Text = tik)
    End Sub

так же. в полтора раза медленнее реального времени считает с интервалом 10мс

fkthis,
как десять лет назад, когда начинал с vb6 на этом форуме, так и сейчас, раздражают спамеры
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013755
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробуй в дополнительном потоке его запускать.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013881
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Пробуй в дополнительном потоке его запускать.

Это ничего не даст - таймер из System.Windows.Forms работает в основном GUI-потоке, и срабатывает по оконным сообщениям, при запуске в отдельном потоке его придётся синхронизировать с основным. А другие таймеры (из System.Threading, System.Timers) хоть и срабатывают в своём отдельном потоке, но, поскольку вывод делаестя в label, то и их придется синхронизировать, и на этой синхронизации опять возникнут задержки. Подсчитывать точное время при наличии операций, завязанных на GUI - дело ещё то.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013890
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Подсчитывать точное время при наличии операций, завязанных на GUI - дело ещё то.

В таких случаях надо просто не полагаться на таймер, а в обработчике события запрашивать настоящее текущее время (DateTime(Offset).(Utc)Now.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013891
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Еще раз. Таймер 1 мс слишком маленький. Тики будут пропускаться, пока идет обработка

Мне, кстати, вот, любопытно он будет тики пропускать, или забъет очередь GUI своими сообщениями?
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013892
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Shocker.Pro
Еще раз. Таймер 1 мс слишком маленький. Тики будут пропускаться, пока идет обработка

Мне, кстати, вот, любопытно он будет тики пропускать, или забъет очередь GUI своими сообщениями?
Будет пропускать, иначе очередь хрен дойдет до других сообщений.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013897
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось только найти еще киберглаз, который сможет замечать изменения в Label с частотой в 1 мс.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013900
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
он будет тики пропускать
именно это ТС блестяще продемонстрировал с примером )
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013904
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
fkthat
он будет тики пропускать
именно это ТС блестяще продемонстрировал с примером )

Ну я выше как раз и написал, что непонятно, что ТС имеет в виду под словом "отстает". То ли тик пропускает, то ли этот тик приходит в хендлер только через полчаса. Тут уже привычно, что, чтобы дешифровать вопросы надо быть вторым Тьюрингом.
...
Рейтинг: 0 / 0
медленный бесполезный таймер
    #40013906
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
ТС имеет в виду
Ну да, ТС имел ввиду, что таймер идет медленнее, потому что он не знал о пропуске тиков и неверно трактовал ситуацию.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / медленный бесполезный таймер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]