powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Программирование таймеров в VB.Net
36 сообщений из 36, показаны все 2 страниц
Программирование таймеров в VB.Net
    #39999365
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня вопрос к знатокам. Если в проекте несколько одновременно работающих таймеров работают ли они параллельно (одновременно)? Скажем одним таймером я осуществляю обмен с последовательным портом Ser1, а вторым с портом Ser2. Будет ли обмен идти параллельно?
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #39999370
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вопрос не к таймерам, а к организации многопоточной работы в твоей программе. Если будешь обрабатывать всё в одном потоке (например в потоке синхронизации), то не будет.
Таймеров тоже несколько видов в .NET
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #39999389
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
Программирование таймеров в VB.Net
    #39999394
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверить элементарно: завесь один таймер, MessageBox() или пауза длинная, и смотри второй срабатывает или нет.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #39999396
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, это идея, попробую.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #39999408
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Программирование таймеров в VB.Net
    #39999780
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот элементарный проект с тремя таймерами на 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
Программирование таймеров в VB.Net
    #39999839
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот код ровным счетом ничего не показывает.
Судя по всему, ты под "параллельностью" понимаешь что-то своё.

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

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

Slava777
Нужно ли их разносить по двум таймерам? Первый скажем более быстрый, а второй менее.
А какая, собственно, разница, ты же с разными портами работаешь.
Если у тебя есть какая-то длительная математика на обработке для порта №1, и ты не хочешь, чтобы обмен с портом №2, от этого тормозился, тогда делай расчеты в отдельном потоке, а не в потоке синхронизации, как сейчас.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #39999997
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за помощь.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40000145
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, можно все реализовать через Task'и (с асинхронностью или без) и свою реализацию TaskScheduler'а который будет сам управлять очередностью выполнения задач. Либо без Шедулера, просто в цикле с выходом по операции отмены, вместо таймера можно сделать ожидание N секунд.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010422
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Программирование таймеров в VB.Net
    #40010429
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava777
Но возникает проблема
Slava777
не идут
Нет конкретного вопроса - нет конкретного ответа. Обновлять контролы формы из другого потока напрямую нельзя, для этого есть Form.Invoke
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010436
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Поскольку таймеры ты инициализируешь не одновременно то, скорее всего, выполняться хендлеры будут в последовательности инициализации. Но без гарантии, естественно.

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

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

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

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

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

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


тебе как раз и нужем формсовский таймер. У тебя же иначе все падать будет - ты вызываешь контрол из чужого потока.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010477
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, хорошо пуст без всяких контролов на форме. Например так
...................
Private Sub t3_tic(ByVal sender As System.Object, ByVal e As System.EventArgs)
check = check + 1
End Sub

Module Module1
Private check As Integer
End Module
Тоже не проходит. А мне нужно синхронизировать много переменных между потоками (таймерами)
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010479
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, мне нужно синхронизировать большой объем переменных с основного потока (проект с формами) с другими потоками. Где то такое:
Module Module1
Public T45(10), TU45(10), iu45(10), ipar_f, t_diam As Integer
Public T60(10), TU60(10), iu60(10), ireg, ipar_i As Integer
Public ib45, i45ch, ib60, i60ch, it, itt, ipar_ch As Integer
Public izap, irab, iost, idi, icalc, ipar, ipusk, zagr60 As Integer
Public i_ch_rab_ost, i_ch_ost_zap, i_ch_zap_ost, i_ch_zap_rab, i_ch_rab_zap As Integer
Public ostanov, zapravka, rabota, pus60, pus60_m, pusk60, pusk60_m As Integer
Public pus45, pus45_m, pusk45, pusk45_m, idiam, nt, nc_d As Integer
Public AO(4), dv, dw60v, dw60e As Double
Public DI(9, 8), DDO(9, 8), DII(9, 8), DDOO(9, 8), id, noxl1, noxl2, noxl3 As Integer
Public ixd(315), iyd(315), ixt(84), iyt(84), ixc(84), iyc(84), ixp(48), iyp(48)
Public spar(24), sd As String
Public par_t(25), w60, w45, diam, diam_av, diam_o, a60, a60o, a45, a45o As Double
Public v_lin, sum_diam, p_err, p_erro, i_err, d_err, s_err, pid4 As Double
End Module

Возможно ли это в принципе?
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010484
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava777
Тоже не проходит.

А что именно не проходит?

Да, кста, для таких случаев необходимо, конечно, использовать "Interlocked.Increment".
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010487
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010489
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava777
Возможно ли это в принципе?

Конечно, возможно, путей мильон. Самое простое - глобальную блокировку ставить допустимо?. Если да, то просто создай отдельную глобальную (статическую) переменную "static object locker = new object()" (извиняюсь за шарп, но в басике я только читатель), и используй конструкцию "lock(locker) { ... }".
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010492
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, извиняюсь проходит просто с переменной в модуле было Private вместо Public, поэтому и не проходило. Но чтобы связать контролы (например, labels) в формах основного потока с дополнительными потоками , для каждой метки создавать свой делегат ?
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010493
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One, спасибо я так и предполагал. Но если контролов много, создавать делегаты для каждого?
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010500
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
И еще, да, мышкой в дизайнере их не нарисуешь

Таймер из пространства имен Winform Forms'А добавляется как элемент управления, на сколько я помню.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010502
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava777
Konst_One, спасибо я так и предполагал. Но если контролов много, создавать делегаты для каждого?

Если тебе просто нужно обратиться к контролу из другого потока, то ты это должен делать через Control.Invoke . Вообще я бы очень сильно задумался что все-таки не пора ли переходить на что-то более новое. Девелопить под 2.0 (а у вас ведь как я понял 2.0) на исходе 2020 года, это как полировать окаменевшее гамно динозавра.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010511
Slava777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat, спасибо, буду пробовать. Дело в том, что нужно делегировать еще и не стандартные контроллы, разработанные китайцами.
...
Рейтинг: 0 / 0
Программирование таймеров в VB.Net
    #40010551
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava777
Дело в том, что нужно делегировать еще и не стандартные контроллы, разработанные китайцами.

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


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