Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать делегате на некоторое время 
V
    Опции темы
Crypton
Дата 7.9.2009, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Возникла такая задачка. Надо реализовать особенный «слайд-шоу» где в каждом «слайде» должен вызываться делегат на определенное время. То есть делегату дается например 7 секунд на выполнение. По истечении времени делегат прерывается и исполняется следующий по списку. В конце списка указатель возвращается наверх и цикл повторяется. И еще один нюанс. Надо дать булевский параметр исполняемому делегату (по референсу может быть?) что-бы можно было как-нибудь задержать таймер если например в слайде есть менюшка.
 smile 


Вот, что пока получилось.
Код

 public class SlideStack {
        /// <summary>
        /// Задержка на каждом слайде
        /// </summary>
        public int WaitDelay = 7000;
        /// <summary>
        /// Включен/невключен таймер
        /// </summary>
        public bool Enabled = true;
        /// <summary>
        /// Можно-ли передвигать указатель на след. слайд?
        /// </summary>
        public bool canTransition = true;
        /// <summary>
        /// Делегат для каждого слайда, собсвтенно исполняемая функция
        /// </summary>
        public delegate void View();
        /// <summary>
        /// Список функций-слайдов
        /// </summary>
        public List<View> Views = new List<View>();
        /// <summary>
        /// Индекс текущего слайда
        /// </summary>
        private int currentView=0;
        /// <summary>
        /// Если в данный момент происходит переход на след. слайд
        /// </summary>
        public bool Transitioning = false;
        public SlideStack() {
        }
        /// <summary>
        /// Начать
        /// </summary>
        public void Start() {
            // если нет слайдов, то делать тут больше нечего
            if (Views.Count == 0) return;
            // прогрессируем пока включены
            while (Enabled) {
                Transitioning = true;
                /*
                 * на след слайд. вот интересно как где-то тут (?) ограничить выполнение
                 * фукнции, но только пока canTransition=true
                 */
                rotate();
                Transitioning = false;
                // хз?
                Thread.Sleep(WaitDelay);
            }
        }
        /// <summary>
        /// Передвигает указатель на след. слайд
        /// </summary>
        void rotate() {
            if (!canTransition) return;
            if (currentView == Views.Count - 1) currentView = 0;
            Views[currentView].Invoke();
        }
    }

--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Zakonnic
Дата 7.9.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 25.4.2006

Репутация: 2
Всего: 6



А что, в списке Views могут одновременно содержаться разные функции? Может и не нужен никакой список?

В любом случае, быстро переделать можно так:
Код


        ...

        private System.Threading.Timer t;

        public SlideStack()
        {
            t = new System.Threading.Timer(new TimerCallback(rotate), null, Timeout.Infinite, 0);
        }
        
        /// <summary>
        /// Начать
        /// </summary>
        public void Start()
        {
            // если нет слайдов, то делать тут больше нечего
            if (Views.Count == 0) return;
            
            // прогрессируем пока включены            
            t.Change(0, WaitDelay);
        }
        /// <summary>
        /// Передвигает указатель на след. слайд
        /// </summary>
        void rotate(object o)
        {
            if (!(canTransition && Enabled)) return;
            currentView = (currentView + 1) % Views.Count;
            Views[currentView].Invoke(null);
        }
    }

--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
Crypton
Дата 8.9.2009, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Цитата(Zakonnic @ 7.9.2009,  02:18)
А что, в списке Views могут одновременно содержаться разные функции? Может и не нужен никакой список?

В любом случае, быстро переделать можно так:

Ну сам View это делегат, тоесть так-сказать "хэндл" на исполняемую функцию. Мне нужно будет "листать" по списку выполняя эти функции но каким-то образом ограничить время их выполнения.

Попробую чуть позже, тему пока оставлю актуальной.
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
Crypton
Дата 9.9.2009, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 9.10.2006
Где: США, Санкт-Петерб ург

Репутация: нет
Всего: 2



Не сработало. Думаю жонглировать потоками: создавая отдельный поток для функции и ждать и потом проверить, если функция не закончится то Thread.Abort().

Добавлено @ 02:21
Проблема решена "обычным" способом  smile 
Zakonnic спасибо за другое решение по поднятию индекса smile
Код

public void Start() {
            // если нет слайдов, то делать тут больше нечего
            if (Views.Count == 0) return;
            // прогрессируем пока включены
            while (Enabled) {
                Thread tExec = new Thread(new ThreadStart(rotate));
                tExec.Start();
                Thread.Sleep(WaitDelay);
                if (tExec.ThreadState != ThreadState.Aborted || tExec.ThreadState != ThreadState.Stopped)
                    tExec.Abort();
            }
        }
        /// <summary>
        /// Передвигает указатель на след. слайд
        /// </summary>
        void rotate() {
            currentView = (currentView + 1) % Views.Count;
            Views[currentView].Invoke();
        }


Это сообщение отредактировал(а) Crypton - 9.9.2009, 02:22
--------------------
«Все, что вы знаете — ложь» Теория мироздания 
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.