Остановка ScheduledFuture - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Ответ
Опции темы
Непрочитано 06.11.2012, 10:38   #1
Аватар для coldy

Автор темы (Топик Стартер) Остановка ScheduledFuture

Немного зашел в тупик, поэтому не откажусь от совета.

Вопрос в следующем. Как корректно закрыть таск, ссылка на который записывается в _delayedTask?
Проблема в том, что таск создается несколько раз (собственно видно из цикла и по сути ссылка перезаписывается).
Где должен закрываться _delayedTask видно по коду.

 
 
static class TaskTemporaryHero implements Runnable
    {
        ArrayList<Integer> _players = null;
 
        @Override
        public void run() {
            _players = getTopPvpPlayer();
            if (_players != null && !_players.isEmpty())
            {
                for (Integer charId : _players)
                {
                    L2PcInstance player = L2World.getPlayer(charId);
                    Calendar cal = Calendar.getInstance();
                    cal.setTimeInMillis(System.currentTimeMillis());
                    cal.add(Calendar.MINUTE,HERO_TIME);
                    if (player == null) // На случай, если не был онлайн во время выдачи награды
                        _delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis()), 1000, 60000);
                    else if (!checkCondition(player))
                        _delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis()), 1000, 60000);
                    else
                        TemporaryHeroTask.setTemporaryHero(player);
                }
            }
            else
                _log.info("TemporaryHeroHask : there is no players to set Hero for top PvP.");
        }
    }
 
    static class TaskDelayedTemporaryHero implements Runnable
    {
        int _charId = 0;
        long _time = 0;
 
        TaskDelayedTemporaryHero(int charId, long time)
        {
            _charId = charId;
            _time = time;
        }
 
        @Override
        public void run() {
            if (_charId != 0)
            {
                L2PcInstance player = L2World.getPlayer(_charId);
                if (player != null && checkCondition(player))
                {
                    setDelayedTemporaryHero(player,_time);
                    _delayedTask.cancel(true);
                }
            }
            else
                _log.warn("TaskDelayedTemporaryHero : charId = 0");
        }
    }
 
 
Code: Java
Перетащить ссылку вместе с таском поидее не получится, ибо по логике вещей описанное ниже работать не будет.

 
_delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis(), _delayedTask), 1000, 60000);
 
Code: Java

ЗЫ: За гавнокод просьба не ругать.
coldy вне форума Ответить с цитированием
Непрочитано 06.11.2012, 11:21   #2
Пользователь

По умолчанию Re: Остановка ScheduledFuture

псевдокод:

Код:
TaskDelayedTemporaryHero closer = new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis());
closer.setTask(ThreadPoolManager.scheduleAtFixedRate(closer , 1000, 60000));
....

Код:
static class TaskDelayedTemporaryHero implements Runnable
    {
        ...
        Future<?> _delayedTask;
        
        ...
 
        void setTask(Future<?> task) 
       {
             _delayedTask = task;
       }
    }
__________________
l2jfree | M.O.R.F. | A.P.S. | Aion | GW2 | BnS
hex1r0 вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 06.11.2012, 11:23   #3
Аватар для Yorie

По умолчанию Re: Остановка ScheduledFuture

Может быть следует хранить список или мапу тасков? Можно цеплять, например, по charId.
И, собственно, зачем куча тасков под каждого игрока? Передавайте в Runnable список игроков и будет у Вас один таск. Не думаю, что в этом классе очень уж критично параллельная выдача временного геройства для каждого игрока.

// Отдать Future в сам таск тоже оригинально
__________________
// aka Deft
Yorie вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 06.11.2012, 11:35   #4
Аватар для coldy

Автор темы (Топик Стартер) Re: Остановка ScheduledFuture

Цитата:
Сообщение от Yorie Посмотреть сообщение
И, собственно, зачем куча тасков под каждого игрока? Передавайте в Runnable список игроков и будет у Вас один таск.
В любом случае получится 2 списка. Те кто готов получить геройство и те кто либо не онлайн, либо не удовлетворяет условиями. На первый взгляд в плане кода получаются огороды. Хотя таски под каждого персонажа такие же огороды. Вообщем попробуемс и по вашему варианту

В целом разобрался. Спасибо всем, кто откликнулся.
coldy вне форума Ответить с цитированием
Непрочитано 06.11.2012, 11:58   #5
Пользователь

По умолчанию Re: Остановка ScheduledFuture

// del, не смотрел ответы

Последний раз редактировалось учусь; 08.11.2012 в 13:33.
учусь вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно скомпилить новую сборку AL aspalt Серверная часть 23 20.10.2010 16:37
При ударах Антареса выдаются ошибки! Skyter Работа со скриптами 19 28.05.2010 18:24


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 01:46. Часовой пояс GMT +3.

Вверх