Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#1: 2018-11-23 17:45:31 ЛС | профиль | цитата
Здравствуйте! Иногда часть схемы нужно запускать в потоке чтоб не подвисала программа. И вопрос можно ли из потока вызывать старт таймера, учитывая что таймер это поток основного приложения? Так же не будет ли ошибок, если запускать из таймера новый поток? Или лучше все таймеры заменить на элементы потока?
карма: 0

0
Ответов: 2059
Рейтинг: 132
#2: 2018-11-23 22:43:48 ЛС | профиль | цитата
Neo писал(а):
Или лучше все таймеры заменить на элементы потока?

Лучше все таймеры заменить на элементы потока.

Таймер - тоже поток.
Таймеров не должно быть, если мы конечно, чего-то не измеряем, или не делаем анимацию, где таймер является свойством скорости объекта(меша).
Всё должно происходить по условию, или событию.
Если появляются таймеры, то чего-то не додумано.
Смотри в сторону архитектуры программы.
карма: 6

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#3: 2018-11-24 00:31:36 ЛС | профиль | цитата
flint2 писал(а):
Если появляются таймеры, то чего-то не додумано.

Это не совсем корректное утверждение. Иногда таймер применяется для перевода событий из одной очереди в другую, те события во второй очереди появятся только после полного завершения первой.
карма: 22

0
Ответов: 704
Рейтинг: 7
#4: 2018-11-24 02:03:49 ЛС | профиль | цитата
flint2 писал(а):
Если появляются таймеры, то чего-то не додумано.

Философское утверждение. Но если клиент пытается подключиться к серверу, который еще не готов? Не ставить же в цикл событие повторной попытки по ошибке подключения, здесь таймер на какое-то время пригодился бы. Или нет?
карма: 0

0
Ответов: 1926
Рейтинг: 172
#5: 2018-11-24 13:08:27 ЛС | профиль | цитата
Поток иссякает до выполнения итерации таймера:

Add(Thread,9586628,343,196)
{
Delay=0
FastStop=0
link(onExec,16279060:doTimer,[])
}
Add(Timer,16279060,399,196)
{
Interval=500
Enable=1
AutoStop=1
link(onTimer,11337576:doMessage,[])
}
Add(Button,16646935,287,196)
{
Left=85
Top=70
link(onClick,9586628:doStart,[])
}
Add(Message,11337576,448,196)
{
}

А вот таймер может запускать новый поток в цикле (лишь бы не накладывались):

Add(Thread,9586628,392,196)
{
Delay=0
FastStop=0
link(onExec,11337576:doMessage,[])
}
Add(Timer,16279060,343,196)
{
Interval=500
Enable=1
AutoStop=1
link(onTimer,9586628:doStart,[])
}
Add(Button,16646935,287,196)
{
Left=85
Top=70
link(onClick,16279060:doTimer,[])
}
Add(Message,11337576,448,196)
{
}

Но поток и сам имеет свой таймер:

Add(Thread,9586628,392,196)
{
link(onExec,11337576:doMessage,[])
}
Add(Button,16646935,336,196)
{
Left=85
Top=70
link(onClick,9586628:doStart,[])
}
Add(Message,11337576,448,196)
{
}
карма: 9
0
Ответов: 2059
Рейтинг: 132
#6: 2018-11-24 16:09:12 ЛС | профиль | цитата
Иногда таймер применяется для перевода событий из одной очереди в другую

Согласен, но перевод событий из одной очереди в другую не есть хорошо.
Философское утверждение.

Не отнюдь, вернее отнюдь нет.
Посмотри, как игрушки делаются...

К примеру, сейчас отладчик делаю для Lua скриптов - потоков немерянно, так всё-таки оказалось правильно не кидать данные из потока в поток, а колбеки делать.
Все задачи... Всё будет хорошо!
карма: 6

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#7: 2018-11-24 16:58:50 ЛС | профиль | цитата
flint2 писал(а):
Согласен, но перевод событий из одной очереди в другую не есть хорошо.

Вся ОС так построена, а тут утверждается обратное. У нас тут не RealTime. Попробуй длинный цикл повесить на onCreate формы, а потом почеши репу, а где же сама форма? А будешь ты ее ждать до ослиной пасхи, пока цикл не кончится. Или попробуй удалить мультик из самого себя без перевода событий в другую очередь. Прямой аналог такого действия это функция ОС -- PostMessage, когда сообщение ставится в очередь, и оно не будет выполнено, пока не закончится та очередь сообщений, из которой функция была вызвана. Или такая функция системы тоже
flint2 писал(а):
не есть хорошо


Редактировалось 1 раз(а), последний 2018-11-24 17:41:58
карма: 22

0
Ответов: 704
Рейтинг: 7
#8: 2018-11-25 00:01:07 ЛС | профиль | цитата
3042, отдельное спасибо за примеры! По первому случаю не ожидал такого. Помню кто-то из форумчан подсказал так не запускать вроде, но давно и я тогда не понял почему. А по второму - главное чтоб не накладывалось что именно?

--- Добавлено в 2018-11-25 00:05:47

nesco, про очереди событий особенно не понятно когда доходит до работы с внешними устройствами. Они отдают данные асинхронно в потоках, накапливаю в массиве и достаю на отработку оттуда. То есть создаю искусственную очередь - так работает более стабильно. А если потоки обрабатывать сходу по мере поступления - бывают пропуски. Потому на системную очередь не надеюсь с потоками, горожу свою очередь с мьютексами.

Редактировалось 1 раз(а), последний 2018-11-25 00:05:47
карма: 0

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#9: 2018-11-25 01:03:17 ЛС | профиль | цитата
Neo писал(а):
Они отдают данные асинхронно в потоках, накапливаю в массиве и достаю на отработку оттуда.

Так и надо делать, но надо следить, чтобы массив не переполнялся.
Neo писал(а):
Потому на системную очередь не надеюсь с потоками, горожу свою очередь с мьютексами.

А это я вообще не понял на кой...
А почему не использовать синхронное событие потока?
карма: 22

0
Ответов: 704
Рейтинг: 7
#10: 2018-11-25 20:32:59 ЛС | профиль | цитата
nesco писал(а):
А это я вообще не понял на кой...
А почему не использовать синхронное событие потока?

А это судьба-злодейка компонент TCP сервера когда отдает асинхронно, то данные целые. А если без потоков - бывает сервер теряет сообщения под нагрузкой или контроллер их не доставляет (от накладки событий видимо). Там не обычные компоненты потоков, но принципиально одно ведь?

Редактировалось 2 раз(а), последний 2018-11-25 20:35:12
карма: 0

0
Ответов: 1926
Рейтинг: 172
#11: 2018-11-25 22:39:45 ЛС | профиль | цитата
Neo писал(а):
главное чтоб не накладывалось что именно?

Чтобы новая итерация таймера не произошла до того, как закончится выполнение потока от первой итерации. Смотри свойства этих компонентов - они могут блокировать повторный запуск, пока не закончился первый.
карма: 9
0
Ответов: 704
Рейтинг: 7
#12: 2018-11-28 01:38:03 ЛС | профиль | цитата
Потоки случайно не засыпают при блокировке рабочего стола? странности с ними наблюдаю. с таймерами увереннее отрабатывало выход пользователя из виндовс при работающей программе и повторном входе.
карма: 0

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)