Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Программирование таймеров в VB.Net / 25 сообщений из 36, страница 1 из 2
16.09.2020, 15:03
    #39999365
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
У меня вопрос к знатокам. Если в проекте несколько одновременно работающих таймеров работают ли они параллельно (одновременно)? Скажем одним таймером я осуществляю обмен с последовательным портом Ser1, а вторым с портом Ser2. Будет ли обмен идти параллельно?
...
Рейтинг: 0 / 0
16.09.2020, 15:14
    #39999370
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Это вопрос не к таймерам, а к организации многопоточной работы в твоей программе. Если будешь обрабатывать всё в одном потоке (например в потоке синхронизации), то не будет.
Таймеров тоже несколько видов в .NET
...
Рейтинг: 0 / 0
16.09.2020, 16:04
    #39999389
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Например, в проекте VS-2010 VB.Net два таймера из стандартных контролов Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick и Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
В этом случае они будут работать параллельно?
...
Рейтинг: 0 / 0
16.09.2020, 16:13
    #39999394
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Проверить элементарно: завесь один таймер, MessageBox() или пауза длинная, и смотри второй срабатывает или нет.
...
Рейтинг: 0 / 0
16.09.2020, 16:14
    #39999396
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Спасибо, это идея, попробую.
...
Рейтинг: 0 / 0
16.09.2020, 16:28
    #39999408
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
Например, в проекте VS-2010 VB.Net два таймера из стандартных контролов Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick и Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
В этом случае они будут работать параллельно?
стандартные контролы винформс работают в потоке пользовательского интерфейса, их события будут обрабатываться последовательно
...
Рейтинг: 0 / 0
17.09.2020, 13:53
    #39999780
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Вот элементарный проект с тремя таймерами на 100 мс каждый. Визуально не видно, что они работают последовательно. При t=1 c. так же не видно неодновременности?
Код: 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.
Public Class Form1
    Dim t1 As Integer
    Dim t2 As Integer
    Dim t3 As Integer

    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        t1 += 1
        Iterator()
    End Sub

    Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        t2 += 1
        Iterator()
    End Sub

    Private Sub Timer3_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        t3 += 1
        Iterator()
    End Sub

    Private Sub Iterator()
        Label1.Text = t1.ToString
        Label2.Text = t2.ToString
        Label3.Text = t3.ToString
    End Sub
...
Рейтинг: 0 / 0
17.09.2020, 14:40
    #39999839
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Этот код ровным счетом ничего не показывает.
Судя по всему, ты под "параллельностью" понимаешь что-то своё.

Будут ли идти все три таймера параллельно? Да.
Будут ли параллельно выполняться хендлеры? Нет.
...
Рейтинг: 0 / 0
17.09.2020, 14:54
    #39999859
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
В какой последовательности будут выполняться хендлеры?
...
Рейтинг: 0 / 0
17.09.2020, 15:06
    #39999872
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Если пришел хендлер по таймеру, а времени выполнения до следующего хендлера по этому таймеру не хватило, что будет?
...
Рейтинг: 0 / 0
17.09.2020, 15:14
    #39999879
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777,

таймер можно сбрасывать и перезапускать после выполнения делегата, но как по мне ими вообще не стоит пользоваться.
если за время выполнения 1 операции время истечет, то 2 операция будет запущена во время первой
...
Рейтинг: 0 / 0
17.09.2020, 15:25
    #39999891
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Если не перезапускать таймер, будут ли выполнены все операции, если придет следующий тик, а все операции еще не успели выполниться?
...
Рейтинг: 0 / 0
17.09.2020, 15:40
    #39999905
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
В какой последовательности будут выполняться хендлеры?
Поскольку таймеры ты инициализируешь не одновременно то, скорее всего, выполняться хендлеры будут в последовательности инициализации. Но без гарантии, естественно.
Slava777
Если пришел хендлер по таймеру, а времени выполнения до следующего хендлера по этому таймеру не хватило, что будет?
Slava777
Если не перезапускать таймер, будут ли выполнены все операции, если придет следующий тик, а все операции еще не успели выполниться?
Не помню точно, вроде бы чужой хендлер встанет в очередь, а вот "своё" событие может быть пропущено, если не закончилась обработка предыдущего.
В любом случае, как сказал Роман, лучше отключать таймер на время обработки события, и потом включать его заново.
...
Рейтинг: 0 / 0
17.09.2020, 16:01
    #39999926
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Shocker.Pro, у меня все таймеры их 2 инициализированы сразу при начале выполнения всего проекта. Значит гарантии нет, что вся арифметика и обмен выполниться, если не уложится по времени и придет следующий тик? У мня вся проблема в том, что есть операции обмена, которые более приоритетны по времени, а есть менее приоритетны. Нужно ли их разносить по двум таймерам? Первый скажем более быстрый, а второй менее.
...
Рейтинг: 0 / 0
17.09.2020, 16:34
    #39999953
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
у меня все таймеры их 2 инициализированы сразу при начале выполнения всего проекта
Они инициализируются последовательно, смотри автосгенерированный код для формы
Slava777
Значит гарантии нет, что вся арифметика и обмен выполниться, если не уложится по времени и придет следующий тик?
Наоборот. Все выполнится. Нет гарантии, что тик не будет пропущен, если обработка предыдущего тика того же таймера не успеет закончится. Но опять же, если ты не успел закончить обмен, то ты же не можешь делать новый обмен, все равно нужно дождаться, пока закончится предыдущий, так что что тут плохого?

Slava777
Нужно ли их разносить по двум таймерам? Первый скажем более быстрый, а второй менее.
А какая, собственно, разница, ты же с разными портами работаешь.
Если у тебя есть какая-то длительная математика на обработке для порта №1, и ты не хочешь, чтобы обмен с портом №2, от этого тормозился, тогда делай расчеты в отдельном потоке, а не в потоке синхронизации, как сейчас.
...
Рейтинг: 0 / 0
17.09.2020, 18:22
    #39999997
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Спасибо всем за помощь.
...
Рейтинг: 0 / 0
18.09.2020, 09:01
    #40000145
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Как вариант, можно все реализовать через Task'и (с асинхронностью или без) и свою реализацию TaskScheduler'а который будет сам управлять очередностью выполнения задач. Либо без Шедулера, просто в цикле с выходом по операции отмены, вместо таймера можно сделать ожидание N секунд.
...
Рейтинг: 0 / 0
21.10.2020, 10:57
    #40010422
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Shocker.Pro, я так понял, что в потоках нужно использовать системные таймеры вот код.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public Class Form1
    Dim Flow_1 As New System.Threading.Thread(AddressOf Flow1)
    Dim Flow_2 As New System.Threading.Thread(AddressOf Flow2)
    'Dim check As Integer
    Dim t3 As New System.Timers.Timer(100)
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Flow1()
        Flow2()
    End Sub
    Private Sub Flow1()
        'MsgBox("Поток 1")
        Timer1.Start()
        t3.AutoReset = True
        t3.Enabled = True
        AddHandler t3.Elapsed, AddressOf t3_tic
        t3.Start()
    End Sub
    Private Sub t3_tic(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Label1.Text = check
    End Sub

Module Module1
    Private check As Integer
End Module



t3 - системный таймер. Но возникает проблема передачи переменных между потоками. Глобальные переменные не идут. Что здесь можно посоветовать?
...
Рейтинг: 0 / 0
21.10.2020, 11:21
    #40010429
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
Но возникает проблема
Slava777
не идут
Нет конкретного вопроса - нет конкретного ответа. Обновлять контролы формы из другого потока напрямую нельзя, для этого есть Form.Invoke
...
Рейтинг: 0 / 0
21.10.2020, 11:47
    #40010436
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Shocker.Pro
Поскольку таймеры ты инициализируешь не одновременно то, скорее всего, выполняться хендлеры будут в последовательности инициализации. Но без гарантии, естественно.

Скорее всего вообще в неопределенной - кто первый в очередь мессагу кинул, тот и победил.

ТС, тебе нужен не таймер из контролов, а какой-нибудь другой. Таймер из контролов он специально для случая когда тебе надо на события таймера делать что-то в GUI. А если хочешь параллельности, то бери либо System.Threading.Timer or System.Timers.Timer. Но вся синхронизация, если нужна, будет уже на тебе. И еще, да, мышкой в дизайнере их не нарисуешь
...
Рейтинг: 0 / 0
21.10.2020, 12:04
    #40010440
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Shocker.Pro, речь идет не о контролах, а о переменных описанных в модуле.
...
Рейтинг: 0 / 0
21.10.2020, 12:05
    #40010441
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
fkthat, я системный таймер и использую, смотрите последний код. Проблема в передаче данных между потоками.
...
Рейтинг: 0 / 0
21.10.2020, 12:08
    #40010443
Slava777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Shocker.Pro, компилятор жалуется, что переменная check создана в другом потоке.
...
Рейтинг: 0 / 0
21.10.2020, 13:09
    #40010464
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
fkthat, я системный таймер и использую, смотрите последний код. Проблема в передаче данных между потоками.

Я в душе не пойму, зачем тебе там еще и потоки? Коллбеки таймеров и так будут вызываться асинхронно в отдельных потоках взятых из пула, а у тебя какая-то на горе гора получилась.

По-хорошему про существование класса Thread лучше вообще забыть. Для многопоточности есть куча готовых более высокоуровневых
паттернов. Если говорить о "старом" дотнет, то, навскидку, QueueWorkItem, асинхронные вызовы, BackgroundWorker, и те же всевозможные таймеры. Ну а если фреймворк поновее, то тут, да, TPL наше все :)
...
Рейтинг: 0 / 0
21.10.2020, 13:21
    #40010473
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программирование таймеров в VB.Net
Slava777
Shocker.Pro, компилятор жалуется, что переменная check создана в другом потоке.

Погоди-ка. Судя по

Код: c#
1.
Label1.Text = check


тебе как раз и нужем формсовский таймер. У тебя же иначе все падать будет - ты вызываешь контрол из чужого потока.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Программирование таймеров в VB.Net / 25 сообщений из 36, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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