Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Асинхронный запуск множества таймеров

Anna | 17.06.2014 | нет комментариев
Нужно сделать так, что б символы сыпались. Как в фильме «Матрица».
На JS я сделал такое. Специальных задач не появлялось. Сейчас необходимо сделать тоже самое под WP на C#.
Начал делать и столкнулся с загвоздкой: при запуске таймера и навешивании на него требуемой функции в цикле цикл е перебирает, так как ожидает, пока отработает таймер.

Вот то, что я сделал:

Создаю сетку из элементов. Которые потом будут меняться. Все работает.

    public partial class MainPage : PhoneApplicationPage
    {
//координаты для метаморфозы координат клеточки, в которой меняется символ
        int x;
        int y;
        // Конструктор
        public MainPage()
        {
            InitializeComponent();
            double ScreenWidth = System.Windows.Application.Current.Host.Content.ActualWidth;
            double ScreenHeight = System.Windows.Application.Current.Host.Content.ActualHeight;

            int i, j, countWidth, countHeight, count = 0;
            bool flag = false;
//Количество ячеек
            countWidth = (int)Math.Round(ScreenWidth / 50);
            countHeight = (int)Math.Round(ScreenHeight / 50);

            Random random = new Random();

            if (flag == false)
            {
                for (i = 0; i < countWidth; i  )
                {
                    for (j = 0; j < countHeight; j  )
                    {
                        TextBlock asd = new TextBlock();
                        asd.Name = "TB_"   i   "_"   j;  //имя, по которому буду находить элемент для метаморфозы его содержимого
                        asd.Text = char.ConvertFromUtf32(random.Next(0x4E00, 0x4FFF));
                        int wx = i * 50;
                        int wy = j * 50;
                        asd.Foreground = new SolidColorBrush(Colors.Green);
                        asd.Margin = new Thickness(wx, wy, 0, 0);
                        asd.FontSize = 36;
                        LayoutRoot.Children.Add(asd);
                    }
                }
                flag = true;
            }

            // Пример кода для локализации ApplicationBar
            //BuildLocalizedApplicationBar();
        }

При нажатии на экран запускается «Матрица». Вернее должна запускаться.Пока работает только 1 символ, тот, что даже двигаться не хочет.

        private void TapMainGrid(object sender, System.Windows.Input.GestureEventArgs e)
        {
            double ScreenWidth = System.Windows.Application.Current.Host.Content.ActualWidth;
            double ScreenHeight = System.Windows.Application.Current.Host.Content.ActualHeight;

            int i, j, countWidth, countHeight, count = 0;

            countWidth = (int)Math.Round(ScreenWidth / 50);
            countHeight = (int)Math.Round(ScreenHeight / 50);

            Random random = new Random();

            this.x = 0;
            for (i = 0; i < countWidth; i  )
            {
//Так же не осознал, как передать довод в событие, следственно меняю глобальную переменную.
//Теоретически должен падать 1 меняющийся символ.
                this.y = i;

                var stopHandle = EasyTimer.SetInterval(() =>
                {
                    TimerCallback1();                                                             /!!!!!!!!!!!!!!!!Здесь задача. Цикл не отрабатывает, пока работает счетчик. А мне необходимо, тоб паралельно куча таких работала.
                    // --- You code here ---
                    // This piece of code will run after every 1000 ms
                    // To stop the timer, just dispose off the stop handle

                }, 100);

            }/*
            DispatcherTimer newTimer = new DispatcherTimer();
            newTimer.Interval = TimeSpan.FromSeconds(0.1);
            newTimer.Tick  = TimerCallback;
            newTimer.Start();*/
        }

Функция метаморфозы клетки и символа в ней

        public void  TimerCallback1()
        {

            Random random = new Random();
            string asdf = "TB_"   this.x   "_"   this.y;
            object wantedNode = LayoutRoot.FindName(asdf);
            TextBlock txt = (TextBlock)wantedNode;
            txt.Text = char.ConvertFromUtf32(random.Next(0x4E00, 0x4FFF));
        }
 

Класс таймера. Обнаружил в интернете. Пришлось переделать, что б работал на WP.

    public static class EasyTimer
    {
        public static IDisposable SetInterval(Action method, int delayInMilliseconds)
        {
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(delayInMilliseconds/1000);
            timer.Tick  = (source, e) =>
            {
                method();
            };

            //timer.Enabled = true;
            timer.Start();

            // Returns a stop handle which can be used for stopping
            // the timer, if required
            return timer as IDisposable;
        }
        /*
        public static IDisposable SetTimeout(Action method, int delayInMilliseconds)
        {
            System.Timers.Timer timer = new System.Timers.Timer(delayInMilliseconds);
            timer.Elapsed  = (source, e) =>
            {
                method();
            };

            timer.AutoReset = false;
            timer.Enabled = true;
            timer.Start();

            // Returns a stop handle which can be used for stopping
            // the timer, if required
            return timer as IDisposable;
        }*/
    }

Пробовал добавить async в способ SetInterval Класса EasyTimer. Пишет что невозможно применять с IDisposable.
Задача в том, что больше велико рыть начал, но асинхронный вызов функций и события (навешивающиеся на таймер) пока еще не крепко отлично понимаю.

Допустимо подскажите как сделать для этой реализации либо допустимо ошибки в моей логике.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB