Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329

Как остановить или указать начальное значение для таймера в Reactive Extensions

26.03.2014, 03:18. Показов 2936. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хай народ, мне нужно сделать свой таймер, потому что стандартный System.Timers.Timer работает некорректно Для этого нагуглил расширение Reactive. И вот в нем есть куча всяких штучек непонятных. Мне нужно могти запускать таймер, когда нужно, и чтобы счет тиков таймера начинался с определенного значения. Еще надо уметь приостанавливать таймер, ну ставить на паузу. Так вот, что я осилил:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 class Program
    {
        static void Main(string[] args)
        {
            var observ = Observable.Publish(Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(500)),10000);
            //каждые 500 миллисекунд будет выполнятся какой-то метод, отсчет начинается с 10000
            observ.Subscribe(method); //указываю, какой метод будет выполняться
            observ.Connect(); //таймер начал работать
           
            Console.Read();
        }
 
        static void method(long t) //сюда передается счетчик таймера, то есть число уже произошедших тиков таймера
        {
            Console.WriteLine(t); //просто вывожу это число
        }
    }
проблема в том, что я не знаю, как остановить или приостановить работу этого таймера и еще одна проблема в том, что счетчик таймера начинает отсчет не с 10000, вернее с 10000, но не совсем, на картинке все видно.
Поясните, пазязя, как мне остановить таймер и как начать его выполнение с нужного значения? ну чтобы счетчик этот считался с 10000, например.
Миниатюры
Как остановить или указать начальное значение для таймера в Reactive Extensions  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2014, 03:18
Ответы с готовыми решениями:

Как поставить начальное значение для combobox?
Добавляется значение так: SendMessage (comboBoxName, CB_ADDSTRING, 0, (LPARAM)"word"); а как поставить начальное значение? ...

Выписать итерационную формулу и указать начальное приближение для решения уравнения
Помогите выполнить задание: Выписать итерационную формулу и указать начальное приближение для решения ур. ln(x)-\frac{1}{x}=0

Решение не найдено. Попробуйте изменить начальное приближение либо значение TOL или CTOL
Здравствуйте! В ходе расчета возникла ошибка.O_o Пожалуйста, подскажите как можно исправить.

7
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
26.03.2014, 06:02
C#
1
Хай народ, мне нужно сделать свой таймер, потому что стандартный System.Timers.Timer работает некорректно Для этого нагуглил расширение Reactive.
Rx предназначены мягко говоря _совсем_ не для этого, а некорректность работы стандартного таймера скорее всего исходит из его неправильного использования. возможно ваша задача решалась бы проще, если бы вы указали в чем именно проблема с таймером

Поясните, пазязя, как мне остановить таймер
зачем вы делаете Publish? этот метод позволяет вам использовать ваш IObservable несколькими последовательностями одновременно, вам это не нужно

C#
1
2
3
4
var subscription = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(500)).Subscribe(Console.WriteLine); 
// запустили таймер подписавшись на уведомления от IObservable
subscription.Dispose();
// отписались от уведомлений, мы их больше не получаем, таймер "остановлен"
как начать его выполнение с нужного значения
таймер генерирует вам последовательность чисел с определенным периодом
вы вольны делать с ней дальше все что захотите, например добавить к каждому числу некоторое "стартовое" значение
C#
1
2
3
                Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(500))
                    .Select(x => x + 10000)
                    .Subscribe(Console.WriteLine);
вуаля, таймер "начинает отсчет" с 10000

з.ы. хороший мануал по Rx - http://www.introtorx.com
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
26.03.2014, 14:12  [ТС]
Цитата Сообщение от Tessen Посмотреть сообщение
Rx предназначены мягко говоря _совсем_ не для этого, а некорректность работы стандартного таймера скорее всего исходит из его неправильного использования. возможно ваша задача решалась бы проще, если бы вы указали в чем именно проблема с таймером
значит, использую я все правильно! (ну таймеры) Проблема была в том, что есть два приложения, одно из них - это Windows Form Application, а второе - проект в Unity3D (в котором скрипты пишутся на C#) Так вот, когда я запускаю сервер (WFA), то таймер начинает работать и увеличивать переменную на 1 каждые 50мс, когда запускается клиент (Unity3D), он берет от сервера текущее значение переменной и запускает свой таймер, при этом переменной на клиенте присваивается значение серверной переменной и после этого таймер начинает её увеличивать на 1, так вот, проблема в том, что таймер на сервере отстает от таймера на клиенте. Я уже создавал тему эту Почему Timer в одном приложении работает медленнее, чем в другом?
и для чего предназначены Rx ?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
26.03.2014, 14:36
Rx предназначены для обработки данных на лету

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

решение: осуществлять поиск не путем "нашли все - отдали пользователю" а через Rx - идем по данным, как нашли подходящие - отдаем клиенту
поскольку поиск долгий - как только клиент ввел следующий символ запрос должен останавливаться и создаваться новый

решение на Rx выглядит примерно так:

C#
1
2
3
4
5
6
IObservable<string> searchValues = ....;
IObservable<IObservable<string>> search = searchValues
.Select(searchText=>SearchResults(searchText));
var subscription = search
.Switch()
.Subscribe(Console.WriteLine);
написать на нем таймер конечно можно, но имхо это выглядит как попытка прогнать муху с монитора выстрелом в нее из дробовика

тем более я сомневаюсь, что в своих недрах Rx использует что то сильно отличающееся от обычного таймера... по крайней мере для создания последовательности через Observable.Timer или Observable.Interval
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
26.03.2014, 14:51  [ТС]
Tessen, а чем же тогда запилить таймер, который одинаково правильно бы работал во всех приложениях?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
26.03.2014, 19:45
не могли бы вы скинуть небольшой проект (собственно состоящий исключительно из двух таймеров) чтобы продемонстрировать проблему?
0
17 / 5 / 3
Регистрация: 22.03.2011
Сообщений: 329
26.03.2014, 21:23  [ТС]
Tessen, окей, но один проект это Windows Forms, а второй - Unity3D, ну то есть вы не сможете его открыть без Unity3D, но запустить сможете, и вот я вам код используемый в этом проекте покажу
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.Timers;
using UnityEngine;
using System.Collections;
 
public class timer : MonoBehaviour
{
    private Rect rect; 
    private long l = 0;
    private Timer timer1;
 
    void Start()
    {
        rect=new Rect(Screen.width/2-50,Screen.height/2-15,100,30);//определяем место в котором будет отображаться значение переменной
 
        timer1=new Timer();
        timer1.Interval = 50; //выполнение каждые 50 миллисекунд
        timer1.Elapsed += Handler; //вот этого метода
        timer1.Start();
    }
 
    private void Handler(object sender, ElapsedEventArgs e)
    {
        l++;
    }
 
    void OnGUI()
    {
        GUI.Label(rect,l.ToString()); //выводим значение переменной на экран
    }
}
ну а код проекта WF почти такой же, только там в textBox выводится переменная, ну вы сами этот уже проект посмотрите, хотя там ничего такого нету.
В папке "test timer unity3D" вы найдете exe файл, вот можете запустить его и счетчик начнет работать, а потом запустите проект WF, сделайте скриншот значений двух счетчиков и посмотрите на разницу, а потом подождите секунд 30 и сделайте снова скриншот, и увидите, как изменится разница между значениями.

p.s. если приложение unity3D во весь экран, то просто жмякните Alt+Enter
Вложения
Тип файла: rar Projects.rar (6.05 Мб, 4 просмотров)
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
27.03.2014, 20:56
посмотрел
действительно, обычные c# таймеры работают не совсем корректно - вместо ваших 50мс будет ~60-65, как повезет, Rx вашу проблему как и предполагалось не решает

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

на Rx-так

C#
1
2
3
4
 var startTime=DateTime.Now;
var subscription = Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(50))
                    .Select(x => (DateTime.Now-startTime).TotalMilliseconds/50)
                    .Subscribe(x =>textBox1.Text=x.ToString());
таймером так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       private DateTime startTime;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 50;
            timer.Elapsed += Handler;
            StartTime=DateTime.Now;
            timer.Start();
        }
 
        private void Handler(object sender, ElapsedEventArgs e)
        {
            textBox1.Invoke(new Action(() => { textBox1.Text = ((DateTime.Now - startTime).TotalMilliseconds/50).ToString(); }));
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2014, 20:56
Помогаю со студенческими работами здесь

Начальное значение для переменных-перечислений
enum {purchasing, selling, noAction} action; При таком объявлении, начальное значение action в 10 из 10 запусков - purchasing. Суть...

Установить начальное значение для поля с auto increment
как установить начальное значение для поля с AI, например если мне надо чтоб счёт поля ID начинался с 1157..... как это сделать? и возможно...

Начальное значение в DataGridViewComboBoxColumn разное для каждой строки
Здравствуйте! Проблема в том, что при заполнении DataGrid в стобце DataGridComboBox для каждой строки надо устанавливать своё значение....

Как установить начальное значение dateTimePicker?
c#: Не могу при открытии формы установить начальное значение dateTimePicker. Строка DateTime date2010 = new DateTime(2010, 12, 31,...

Как задать начальное значение value в TrackBar?
Привет. Застрял с задачкой в vs2015. Подскажите. В программе я использую файл для настроек. Он читается кодом и вводит переменные, в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru