|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
У меня вопрос к знатокам. Если в проекте несколько одновременно работающих таймеров работают ли они параллельно (одновременно)? Скажем одним таймером я осуществляю обмен с последовательным портом Ser1, а вторым с портом Ser2. Будет ли обмен идти параллельно? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 15:03 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Это вопрос не к таймерам, а к организации многопоточной работы в твоей программе. Если будешь обрабатывать всё в одном потоке (например в потоке синхронизации), то не будет. Таймеров тоже несколько видов в .NET ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 15:14 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Например, в проекте 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 В этом случае они будут работать параллельно? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 16:04 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Проверить элементарно: завесь один таймер, MessageBox() или пауза длинная, и смотри второй срабатывает или нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 16:13 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Спасибо, это идея, попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 16:14 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
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 В этом случае они будут работать параллельно? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2020, 16:28 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Вот элементарный проект с тремя таймерами на 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:53 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Этот код ровным счетом ничего не показывает. Судя по всему, ты под "параллельностью" понимаешь что-то своё. Будут ли идти все три таймера параллельно? Да. Будут ли параллельно выполняться хендлеры? Нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 14:40 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
В какой последовательности будут выполняться хендлеры? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 14:54 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Если пришел хендлер по таймеру, а времени выполнения до следующего хендлера по этому таймеру не хватило, что будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 15:06 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777, таймер можно сбрасывать и перезапускать после выполнения делегата, но как по мне ими вообще не стоит пользоваться. если за время выполнения 1 операции время истечет, то 2 операция будет запущена во время первой ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 15:14 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Если не перезапускать таймер, будут ли выполнены все операции, если придет следующий тик, а все операции еще не успели выполниться? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 15:25 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 В какой последовательности будут выполняться хендлеры? Slava777 Если пришел хендлер по таймеру, а времени выполнения до следующего хендлера по этому таймеру не хватило, что будет? Slava777 Если не перезапускать таймер, будут ли выполнены все операции, если придет следующий тик, а все операции еще не успели выполниться? В любом случае, как сказал Роман, лучше отключать таймер на время обработки события, и потом включать его заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 15:40 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Shocker.Pro, у меня все таймеры их 2 инициализированы сразу при начале выполнения всего проекта. Значит гарантии нет, что вся арифметика и обмен выполниться, если не уложится по времени и придет следующий тик? У мня вся проблема в том, что есть операции обмена, которые более приоритетны по времени, а есть менее приоритетны. Нужно ли их разносить по двум таймерам? Первый скажем более быстрый, а второй менее. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 16:01 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 у меня все таймеры их 2 инициализированы сразу при начале выполнения всего проекта Slava777 Значит гарантии нет, что вся арифметика и обмен выполниться, если не уложится по времени и придет следующий тик? Slava777 Нужно ли их разносить по двум таймерам? Первый скажем более быстрый, а второй менее. Если у тебя есть какая-то длительная математика на обработке для порта №1, и ты не хочешь, чтобы обмен с портом №2, от этого тормозился, тогда делай расчеты в отдельном потоке, а не в потоке синхронизации, как сейчас. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 16:34 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Спасибо всем за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 18:22 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Как вариант, можно все реализовать через Task'и (с асинхронностью или без) и свою реализацию TaskScheduler'а который будет сам управлять очередностью выполнения задач. Либо без Шедулера, просто в цикле с выходом по операции отмены, вместо таймера можно сделать ожидание N секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 09:01 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
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.
t3 - системный таймер. Но возникает проблема передачи переменных между потоками. Глобальные переменные не идут. Что здесь можно посоветовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 10:57 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Но возникает проблема Slava777 не идут ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 11:21 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Shocker.Pro Поскольку таймеры ты инициализируешь не одновременно то, скорее всего, выполняться хендлеры будут в последовательности инициализации. Но без гарантии, естественно. Скорее всего вообще в неопределенной - кто первый в очередь мессагу кинул, тот и победил. ТС, тебе нужен не таймер из контролов, а какой-нибудь другой. Таймер из контролов он специально для случая когда тебе надо на события таймера делать что-то в GUI. А если хочешь параллельности, то бери либо System.Threading.Timer or System.Timers.Timer. Но вся синхронизация, если нужна, будет уже на тебе. И еще, да, мышкой в дизайнере их не нарисуешь ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 11:47 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Shocker.Pro, речь идет не о контролах, а о переменных описанных в модуле. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 12:04 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
fkthat, я системный таймер и использую, смотрите последний код. Проблема в передаче данных между потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 12:05 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Shocker.Pro, компилятор жалуется, что переменная check создана в другом потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 12:08 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 fkthat, я системный таймер и использую, смотрите последний код. Проблема в передаче данных между потоками. Я в душе не пойму, зачем тебе там еще и потоки? Коллбеки таймеров и так будут вызываться асинхронно в отдельных потоках взятых из пула, а у тебя какая-то на горе гора получилась. По-хорошему про существование класса Thread лучше вообще забыть. Для многопоточности есть куча готовых более высокоуровневых паттернов. Если говорить о "старом" дотнет, то, навскидку, QueueWorkItem, асинхронные вызовы, BackgroundWorker, и те же всевозможные таймеры. Ну а если фреймворк поновее, то тут, да, TPL наше все :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:09 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Shocker.Pro, компилятор жалуется, что переменная check создана в другом потоке. Погоди-ка. Судя по Код: c# 1.
тебе как раз и нужем формсовский таймер. У тебя же иначе все падать будет - ты вызываешь контрол из чужого потока. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:21 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
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 Тоже не проходит. А мне нужно синхронизировать много переменных между потоками (таймерами) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:31 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
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 Возможно ли это в принципе? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:37 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Тоже не проходит. А что именно не проходит? Да, кста, для таких случаев необходимо, конечно, использовать "Interlocked.Increment". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:51 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
тут посмотрите https://www.vbforums.com/showthread.php?498387-Accessing-Controls-from-Worker-Threads ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:53 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Возможно ли это в принципе? Конечно, возможно, путей мильон. Самое простое - глобальную блокировку ставить допустимо?. Если да, то просто создай отдельную глобальную (статическую) переменную "static object locker = new object()" (извиняюсь за шарп, но в басике я только читатель), и используй конструкцию "lock(locker) { ... }". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 13:58 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
fkthat, извиняюсь проходит просто с переменной в модуле было Private вместо Public, поэтому и не проходило. Но чтобы связать контролы (например, labels) в формах основного потока с дополнительными потоками , для каждой метки создавать свой делегат ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:07 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Konst_One, спасибо я так и предполагал. Но если контролов много, создавать делегаты для каждого? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:09 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
fkthat И еще, да, мышкой в дизайнере их не нарисуешь Таймер из пространства имен Winform Forms'А добавляется как элемент управления, на сколько я помню. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:23 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Konst_One, спасибо я так и предполагал. Но если контролов много, создавать делегаты для каждого? Если тебе просто нужно обратиться к контролу из другого потока, то ты это должен делать через Control.Invoke . Вообще я бы очень сильно задумался что все-таки не пора ли переходить на что-то более новое. Девелопить под 2.0 (а у вас ведь как я понял 2.0) на исходе 2020 года, это как полировать окаменевшее гамно динозавра. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:34 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
fkthat, спасибо, буду пробовать. Дело в том, что нужно делегировать еще и не стандартные контроллы, разработанные китайцами. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 14:50 |
|
Программирование таймеров в VB.Net
|
|||
---|---|---|---|
#18+
Slava777 Дело в том, что нужно делегировать еще и не стандартные контроллы, разработанные китайцами. А разницы никакой. Этот метод он в самом базовом классе Control и связан вообще не с самим контролом, а с поток в котором он создан. Например если контролы А и В созданы в одном потоке то из А.Invoke(,,,) можно вызывать не только А, но и В и вообще все контролы которые созданы в том же потоке. Обычно просто вызывают Invoke самой формы. Суть в том, что у тебя все контролы живут в одном "ГУИшном" потоке, когда ты из любого потока вызываешь метод Invoke любого из этих контролов, то код того делегата, который ты передаешь в метод Invoke будут выполнен уже не в вызывающем потоке, а в ГУИшном. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2020, 15:59 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1398454]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 407ms |
0 / 0 |