Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/30: Рейтинг темы: голосов - 30, средняя оценка - 4.50
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923

Бесконечный цикл c Timer start/stop

14.05.2021, 18:42. Показов 6642. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал таймер.
C#
1
private readonly System.Timers.Timer timer1 = new System.Timers.Timer();
Инициализирую в конструкторе.
C#
1
2
timer1.Interval = 250;
timer1.Elapsed += RunCoinValidator;
У меня есть монетоприёмник. Где-то там, в UI, я нажал на кнопку "Старт". Чтобы монетоприёмник работал, ему нужен вечный цикл, который отправляет нужые байты, извещая о работе.
C#
1
2
3
4
5
public void StartDevice()
{
    timer1.Stop();
    RunCoinValidator();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void RunCoinValidator(object sender = null, System.Timers.ElapsedEventArgs e = null)
{
    timer1.Stop();
    try
    {
        while (Running)
        {
            // тут 1 триллиард строк
        }
    }
    catch
    {
        Running = false;
    }
}

При такой реализации у меня бесконечный цикл "блокирует" основной UI поток.
Вопрос весьма простой: как я могу не блогировать UI поток этим вечным циклом, при этом используя Timer?

Я бы мог сделать асинхронно или чере Task.Run() и т.д., но как я знаю Timer сам по себе поток.


Есть пример, но он не абстрактный, а под WinForms, я пытаюсь сделать так, чтобы он был как отдельный, не зависящий от UI проект.
Пример WinForms:
Кликните здесь для просмотра всего текста

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
25
26
27
28
29
        private System.Windows.Forms.Timer timer1;
 
        public Form1()
        {
            timer1.Interval = 250;
            reconnectionTimer.Tick += new EventHandler(reconnectionTimer_Tick);
            reconnectionTimer.Start();
        }
 
        void MainLoop()
        {
            while (Running)
            {
                // tick the timer
                timer1.Enabled = true;
                //...
                while (timer1.Enabled)
                {
                    Application.DoEvents();
                    Thread.Sleep(1); // Yield to free up CPU
                }
            }
        }
 
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2021, 18:42
Ответы с готовыми решениями:

Суть методов Start и Stop класса Timer
Собственно что за timer.start и timer.stop ? Что они делают? P.S не надо копировать мне msdn , я уже читал, и то что там, я не понимаю

Бесконечный цикл
Доброго времени суток! Столкнулся с такой проблемой. Вот условие. Вот код. В чем ошибка? Заранее благодарю!

Бесконечный цикл
Пишу утилиту, которая считывает данные из экселя раз в минуту. На форме два радиобатона вкл/вкл. (можно и что-нибудь другое, не важно) ...

29
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
14.05.2021, 18:56
Как-то пробовал делать свой мессенджер (ну как мессенджер, баловство ). И там я использовал отдельный поток для прослушки входящих данных (сервер). В конце метода (вызываемого в потоке) просто сделал вызов этого же метода, по сути рекурсия. Все нормально работало и не висло.
Тот же бесконечный цикл
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
14.05.2021, 18:59  [ТС]
Tatarin78, спасибо за ответ, но рекурсия, -- в данном случае -- не то, чего ожидаю услышать.
Но как вариант -- учту.
0
312 / 143 / 77
Регистрация: 23.08.2015
Сообщений: 455
14.05.2021, 19:22
Я в вашей реализации не пойму, как вообще используется таймер, если вы его останавливаете постоянно? Может он там и не нужен?
C#
1
2
3
4
5
6
7
8
timer1.Stop(); // здесь вы таймер остановили
    try
    {
        while (Running) // а тут пошел бесконечный цикл который и тормозит всю UI
        {
            // тут 1 триллиард строк
        }
    }
Может это запустить таском?
C#
1
2
while (Running)
...
И если у вас где-то таймер пустится раньше, чем закончится while (Running) будет полный оверхэд
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
14.05.2021, 20:51  [ТС]
Tatarin78, это мне стукнула в голову идея, мол "чтобы у меня не запустилось 2 раза, сделаю-ка я стоп".
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
14.05.2021, 21:34
limeniye, Зачем UI потоку знать о том, что работает монетоприемник?
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
14.05.2021, 22:37  [ТС]
aenye, хм, UI поток в любом случае должен знать про состояние работы монетоприёмника.

Цитата Сообщение от aenye Посмотреть сообщение
Зачем UI потоку знать о том, что работает монетоприемник?
Ну допустим пользователь закинул в приёмник 1 синеверблюдовый баобаб, который толжен отобразиться на экране. Как же я тогда проброшу эту информацию? Ну или случился какой-то сбой и валидатор перестал работать -- на экране должно быть какое-то оповещение и, в идеале, блокировка экрана.

Работать они должны в разных потоках; информция должна упакововаться в события и отправляться почтой России (из потока приёмника в Dispatcher UI потока).

Возможно я что-то не правильно понимаю и заблуждаюсь, я в программировании ещё маслёнок
0
 Аватар для aenye
304 / 186 / 45
Регистрация: 05.07.2018
Сообщений: 580
15.05.2021, 03:55
limeniye, Монетоприемник работает в фоновом режиме и о активностях может уведомлять через события. А кто, как и где эти события обработает - его заботить не должно.
На случай сбоя - то же самое: крутимся в цикле опроса (по RS232, например), потеряли соединение - дернули событие, если нужно - пытаемся реконнектится.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
15.05.2021, 09:03
Лучший ответ Сообщение было отмечено limeniye как решение

Решение

Цитата Сообщение от limeniye Посмотреть сообщение
При такой реализации у меня бесконечный цикл "блокирует" основной UI поток.
Вопрос весьма простой: как я могу не блогировать UI поток этим вечным циклом, при этом используя Timer?
В показанном вами коде, нет причин по которым блокируется GUI.
Возможно они есть в том "миллиарде строк", который вы не показали.

Добавлено через 3 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
Где-то там, в UI, я нажал на кнопку "Старт".
В каком потоке выполняется StartDevice()?
Возможно вы выполняете его однократно в UI потоке.
Тогда на время его выполнения GUI может заморозиться.

А события таймера работают на пуле потоков, поэтому вызов метода RunCoinValidator не может блокировать GUI.

Добавлено через 2 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
Есть пример, но он не абстрактный, а под WinForms,
Этот пример не идентичный первоначальному.
В первоначальном вы используете System.Timers.Timer.
А в этом примере System.Windows.Forms.Timer.
Таймер из Форм работает в UI потоке, так же как WPF таймер DispatcherTimer.

Добавлено через 1 минуту
В примере объявлен метод MainLoop().
А где он вызывается?

Добавлено через 3 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
UI поток в любом случае должен знать про состояние работы монетоприёмника.
Не UI поток, а UI элементы должны представлять состояние (Модели) монетоприёмника.
Таймер должен быть, вообще, в Модели, а не на Форме или в Окне.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
15.05.2021, 11:47  [ТС]
Элд Хасп,
В примере объявлен метод MainLoop().
А где он вызывается?
При нажатии на кнопку, в Windows Forms(это не мой код).



aenye, да, через события и делаю.


В показанном вами коде, нет причин по которым блокируется GUI.
Возможно они есть в том "миллиарде строк", который вы не показали.
Вы сузили круг возможных проблем. Буду искать в других моментах.

Добавлено через 9 минут
Элд Хасп, можно тут подробней?

В каком потоке выполняется StartDevice()?
Возможно вы выполняете его однократно в UI потоке.
Тогда на время его выполнения GUI может заморозиться
По сути, если отбросить класс-оболочку, то я StartDevice() так и вызываю в GUI.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private readonly IValidator coinValidator;
 
//инициализация в конструкторе
public ...
{
    coinValidator = new EmptyCoinValidatorManager();
    if(/*тыры-пыры*/)
    {
        coinValidator = CoinValidatorManager(/* тыры-пыры */);
    }
 
 
    public IValidator GetCoinValidator()
    {
        return coinValidator;
    }
 
}
C#
1
2
//ну и запуск
validatorService.GetCoinValidator().ActiveAccept(); //это запускает StartDevice();
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
15.05.2021, 13:58
Цитата Сообщение от limeniye Посмотреть сообщение
можно тут подробней?
Если он вызывается из GUI (допустим кликер кнопки), то этот метод будет выполняться в потоке GUI и, следовательно, может подвешивать GUI.
сли же он вызывается из системного таймера, то он выполняется на пуле потоков и не должен влиять на GUI.

В целом у вас здесь несколько взаимоисключающих вариантов.
Надо не гадать как у вас реализовано, а точно знать.

Добавлено через 1 минуту
Цитата Сообщение от limeniye Посмотреть сообщение
По сути, если отбросить класс-оболочку, то я StartDevice() так и вызываю в GUI.
Из GUI можно вызывать только "быстрые" методы.
Время исполнения которых единицы миллисекунд.

Добавлено через 7 минут
Цитата Сообщение от limeniye Посмотреть сообщение
Вы сузили круг возможных проблем. Буду искать в других моментах.
Все "долгие" методы (от 10 мС и более) должны выполняться на пуле потоков.
В основном в задачах (Task).
Если долгий метод изменяет состояние Модели (какие-то её данные), то создаётся событие (можно асинхронное).
ViewModel (или Контролер, Презентер) ловит это событие, обрабатывает его данные и, если надо, передаёт их в GUI в основном потоке.
Для привязок WPF переход в основной поток не требуется.
Для привязок Форм - не знаю. Надо проверять.
Но для работы непосредственно с UI элементами, что в WPF, что в Формах - переход в UI поток обязателен.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
16.05.2021, 14:52
Лучший ответ Сообщение было отмечено limeniye как решение

Решение

limeniye, у вас получился очень разбросанный функционал.
Управление ФИЗИЧЕСКИМ устройством у вас чуть ли не в GUI реализовано.

Условно, для WPF- MVVM как это должно выглядеть.

Для работы непосредственно с физическим устройством у вас должна быть создана Модель.
В ней должны быть методы для получения/отправки данных и события.
Если нужно реализовывать какой-то временной цикл для работы с физическим устройством, то он должен быть инкапсулирован в Модели.
Так же если физическое устройство не позволяет создание параллельных методов доступа, то должен быть реализован Singleton.

В целом должно быть что подобное:

1) Аргументы событий:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
namespace CoinAcceptor
{
    /// <summary>Аргумент события изменения IsRunning.</summary>
    public class RunningChangedEventArgs : EventArgs
    {
        public bool IsRunning { get; }
 
        public RunningChangedEventArgs(bool isRunning)
        {
            IsRunning = isRunning;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
namespace CoinAcceptor
{
    /// <summary>Аргумент события изменения состояния монетоприёмника.</summary>
    public class DataStateChangedEventArgs : EventArgs
    {
        public object DataState { get; }
 
        public DataStateChangedEventArgs(object dataState)
        {
            DataState = dataState;
        }
    }
}
2) Часть класса с таймером:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Timers;
 
namespace CoinAcceptor
{
    public partial class CoinAcceptorModel
    {
        /// <summary>Событие извещающее ою изменении состояния Модели: работает/не работает.</summary>
        public EventHandler<RunningChangedEventArgs> RunningChanged;
 
        /// <summary>Флаг работает/не работает.</summary>
        private bool isRunning;
        private void SetRunning(bool isRunning)
        {
            if (this.isRunning == isRunning)
                return;
 
            this.isRunning = isRunning;
            if (isRunning)
                timer.Start();
            else
                timer.Stop();
 
            RunningChanged?.Invoke(this, new RunningChangedEventArgs(isRunning));
        }
 
        public bool GetRunning() => isRunning;
 
        private readonly Timer timer = new Timer()
        {
            Interval = 250,
        };
 
        /// <summary>Вот этот метод будет вызываться таймером на 
        /// произвольном потоке из пула потоков.
        /// Каждый вызов будет на разном потоке.</summary>
        private void OnElapsed(object sender, ElapsedEventArgs e)
        {
            // Если есть опасность недопустимого наложения 
            // вызовов, то лучше при входе останавливать таймер,
            // а при выходе запускать по новой.
            timer.Stop();
 
            // Вызов метода для работы с саммим физическим устройством.
            // Если есть возможность исключения в его работе, то
            // вызов должен быть обёрнут в try-catch и исключение
            // должно быть здесь обработано.
            // Если этого не сделать, то будут баги или падение
            // приложения.
            CoinAcceptorExecute();
 
 
            // Запуск если поднят флаг isRunning
            if (isRunning)
                timer.Start();
        }
 
        public void StartRunning() => SetRunning(true);
        public void StopRunning() => SetRunning(false);
    }
}
3) Часть класса работающая с монетоприёмником:
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
25
26
27
28
29
30
using System;
 
namespace CoinAcceptor
{
    public partial class CoinAcceptorModel
    {
        public EventHandler<DataStateChangedEventArgs> DataStateChanged;
 
        /// <summary>Собственно сам метод работающий с монетоприёмником.</summary>
        private void CoinAcceptorExecute()
        {
            // Получение состояния монетоприёмника.
            object dataState = new object();
 
            // Сравнение с текущим состоянием
            if (Equals(dataStateCoinAcceptor,dataState))
            {
                // Если состояние изменилось, то его обработка
                // и вызов создание события
                dataStateCoinAcceptor = dataState;
                DataStateChanged?.Invoke(this, new DataStateChangedEventArgs(dataState));
            }
        }
 
        /// <summary>Поле хранящее состояние монетоприёмника.
        /// Типизировал просто object, так как для примера это не важно.
        /// В реале должен быть некий конейнер с данными.</summary>
        private object dataStateCoinAcceptor;
    }
}
4) Часть класса реализующая Singlton:
C#
1
2
3
4
5
6
7
8
9
10
11
12
namespace CoinAcceptor
{
    public partial class CoinAcceptorModel
    {
        /// <summary>Закрытый конструктор.</summary>
        private CoinAcceptorModel() => timer.Elapsed += OnElapsed;
 
        /// <summary>Единственственный экземпляр.</summary>
        public static CoinAcceptorModel Instance { get; } = new CoinAcceptorModel();
 
    }
}
Архив с исходниками: CoinAcceptor.7z
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
16.05.2021, 14:56
limeniye, далее ViewModel подписывается на события Модели и прослушивая их обеспечивает актуальные данные монетоприёмника в своих свойствах, которые используются в View для привязки.

Сколько VM будут использовать эту Модель - не важно.
Реализация потокобезопасности (если нужно) должна быть в самой Модели.
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.05.2021, 12:10  [ТС]
Элд Хасп, я так понял CoinAcceptorExecute отвечает за то, чтобы включить валидатор. В таком случае мне не нужен вообще бесконечный цикл, как я понимаю.

Касательно Singlton.
У Вас есть такой вот код:
C#
1
public static CoinAcceptor Instance { get; } = new CoinAcceptor ();
У меня конструктор с параметрами. Могу ли я сделать что-то вроде такого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private static CoinAcceptor _instance = null;
 
        private static Object _mutex = new Object();
 
        public static CoinAcceptorGetInstance(string port, string adress, int[] inhibitCoins, string currency)
        {
            if (_instance == null)
            {
                lock (_mutex) // now I can claim some form of thread safety...
                {
                    if (_instance == null)
                    {
                        _instance = new CoinAcceptor (port, adress, inhibitCoins, currency);
                    }
                }
            }
 
            return _instance;
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
17.05.2021, 13:10
Цитата Сообщение от limeniye Посмотреть сообщение
У меня конструктор с параметрами. Могу ли я сделать что-то вроде такого:
Общего ответа не дашь.
Это же зависит от параметров физического оборудования, предъявляемых им требований.

Просто вы писали о появлении сбоев, при добавлении VM, поэтому скорее всего есть какие-то ограничения на одновременный доступ.
В принципе, такие ограничения, для последовательных внешних устройств довольно частое явление.

У вас идёт подключение через порт.
И если одна задача начала свою передачу и в этот же момент другая начнёт свою - то скорее всего будет неразбериха и сбой.

Как конкретно надо поступать в вашем случае - надо читать документацию на монетоприёмник и его API.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
17.05.2021, 14:01  [ТС]
Элд Хасп, пока что всё работает без сбоев, как швейцарские часы.
Теперь при открывании окна приложение не сбоит, меня это радует. Огромное Вам спасибо!)

Не по теме:

Больше меня радует то, что я почитал о Singlton и мне стало более понятно, зачем Вы пишите приватные конструкторы.
Помнится Вы показывали мне способ извещения об изменении: приватные конструкторы, статические приватные и публичные методы -- у меня чуть голова не лопнула :D

Как я понял, это и был Singlton, о котором я не знал, на тот момент.



Если я теперь понял корректно: Singlton нужен для того, чтобы можно было создать только 1 объект.

Я видел как Вы делали это в NotifyChangedArgsHendler(не помню как точно), и использовали там Singlton. Зачем?
В каких случаях это необходимо?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
17.05.2021, 15:19
Цитата Сообщение от limeniye Посмотреть сообщение
Singlton нужен для того, чтобы можно было создать только 1 объект.
Да.

Добавлено через 1 минуту
Цитата Сообщение от limeniye Посмотреть сообщение
Я видел как Вы делали это в NotifyChangedArgsHendler(не помню как точно), и использовали там Singlton. Зачем?
Я не помню.
Даже название ничего не навевает.

Добавлено через 48 секунд
Цитата Сообщение от limeniye Посмотреть сообщение
В каких случаях это необходимо?
Когда по задаче два и более объекта одного класса могут начать конфликтовать между собой.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 01:19  [ТС]
Элд Хасп, нашёл баг.

Есть функция вывода монет из валидатора.

Допустим валидатор пустой а я пытаюсь из него что-то вывести.

Я отправляю запрос для вывода — приходит false, так и должно быть.

Но когда я очень быстро кликаю на кнопку и отправляю за секунду 4-5 запросов -- валидатор "падает".

С примере с формами подоброй проблемы не возникает почему-то.
Что может вызывать такую проблему?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,105
Записей в блоге: 2
18.05.2021, 08:40
Цитата Сообщение от limeniye Посмотреть сообщение
Что может вызывать такую проблему?
Нужно реализовывать потокобезопасность.
Возможно в Форме вы всё делали в одном потоке: пока кликкер не отработает Форма замораживалась и следующий клик по кнопке не проходил.

Валидатор - это Модель.
И если какие-то методы Модели можно вызывать не всегда, то их надо оборачивать в команды.

1) Вызывается Execute команды;
2) Первыми в методе идёт проверка флага более раннего вызова - bool isExecute. Если флаг поднят, то выход или исключение;
3) Поднятие флага;
4) Выполнение метода;
5) Сброс флага;
6) Выход из Execute метода.

Метод CanExecute возвращает инверсию флага.

Так же можно прокинуть состояние этой команды до команды кнопки в GUI, что вызовет отключение кнопки пока Модель занята.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 10:22  [ТС]
Возможно в Форме вы всё делали в одном потоке: пока кликкер не отработает Форма замораживалась и следующий клик по кнопке не проходил.
Клик проходит. Там в лог выводит информацию, с ошибкой, что в валидаторе нет столько денег. Ошибка в лог выводится столько же раз, сколько я тыкаю на кнопку.



Касательно Execute. Да, я подумал в первую очередь об этом. Но в примере с формами всё отрабатывает идеально, что меня смущает.
Я попробовал сделать
C#
1
2
3
4
5
6
7
8
public async Task<bool> Calculate(int coins)
{
    var res = await Task<bool>.Run(() => 
    {
        return hopper.NameOfMethod(coins);
    }
    return res;
}
После нажатия кнопки у меня зависало приложение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2021, 10:22
Помогаю со студенческими работами здесь

Бесконечный цикл
private void button1_Click(object sender, EventArgs e) { do { if (button1.Text ==...

Бесконечный цикл
Сделал класс с методами для конвертации из двенадцатеричной системы счисления в двоичную. Бесконечный цикл возникает после создания...

Бесконечный цикл
Хелп, не могу избавиться от бесконечной рекурсии public void Run2(string str,int i) { char c; ...

Бесконечный цикл
Как сделать чтобы в консольном приложении цикл выполнялся бесконечно и без остановок, но если я нажму эскейп например, то выходило из...

Бесконечный цикл с задержкой
Нужен бесконечный цикл с периодом выполнения в 1 сек for (int i = 0; i &lt; 10; i++) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru