Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Отложенное использование кода "в основном потоке"

Тема в разделе "Разработка плагинов для новичков", создана пользователем Dymeth, 19 июл 2015.

Статус темы:
Закрыта.
  1. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Добрых суток.
    Недавно задался, казалось бы, простым вопросом: как реализовать "прерывание выполнения" в основном потоке.
    На ум приходит - создать таймер (по сути это отдельный поток), в его теле прописать обычный слип и автоостановку. Хорошо, тогда как "дождаться" завершения таймера? Помнится, использовал различные шедулеры, различные методы типо .join(). Но по непонятным для меня причинам все это дело либо просто не работало, либо кидало адские исключения.

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

    В качестве примера реализации можно привести туториал на Плексе (или Хайпе, точно не помню): сообщение, ожидание, телепортация. Но там, скорее всего, весь туториал выполняется отдельным потоком. Мне же, как я указал выше, это крайне неудобно.

    Идеальным вариантом был бы какой-нибудь метод cooldown(int time).
    Да, звучит глупо, согласен. Но что поделать...

    У кого какие мысли и предложения?
     
    Последнее редактирование: 19 июл 2015
  2. Хостинг MineCraft
    <
  3. Inglar

    Inglar Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Hioshiro
    Использую шедулер, и в ус не дую.
     
  4. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Чедулер - единственный безопасный способ вызвать отложенное исполнение кода.
    Можно конечно исхитриться и сделать обертку с JDeferred
    будет что-то вроде:
    Код:
    timeout(200).then(() => {
        // ... действие через 200 тиков
        return timeout(100);
    }).then(() => {
        // ... действие через 200 + 100 тиков
        return timeout(500);
    });
     
  5. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    А как "дождаться" его завершения? Или как-то по-другому стоит действовать? Можно конкретный примерчик?

    Ни разу не работал с JDeferred. Попробую. Спасибо за пример.
     
  6. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    http://wiki.bukkit.org/Scheduler_Programming
     
  7. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ну а что сложного? В буккит шедулере есть отложенные задания, а не только таймеры. Когда оно выполнится, можно вызвать колбек метод
     
  8. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Прочитай первый пост: http://rubukkit.org/threads/98179/
    Как я понял, у автора вопрос поставлен близко к моему.

    Приведённый в начале код = тело параллельного потока.
     
  9. Автор темы
    Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Уже читал

    Не совсем уловил суть. Но, кажется, это не то. Хотя возможно мне просто не хватает знаний Java.

    Это понятно. Но использование колбек-метода - опять же неудобно. Хотелось бы обойтись без дополнительных заморочек. Если вновь говорить о туториале, то хотелось бы сделать примерно так:
    - Начало туториала
    - В обычном цикле последовательное выполнение команд(
    -- Сообщение
    -- Метод ожидания
    -- Телепортация)
    - Конец туториала

    Сейчас понял, что так невозможно. Поэтому придётся вынести отдельно метод выполнения одной команды (например, runNextCommand()). И в методе ожидания после Thread.sleep() обратно вызывать этот самый runNextConmand(). Какая-то неудобная скачка по коду, лишние телодвижения типо создания списка команд и управления счётчиком номера команды. Неудобно же. Но выбирать не приходится.

    Что ж, всем спасибо. Тема закрыта.
     
    Последнее редактирование: 19 июл 2015
Статус темы:
Закрыта.

Поделиться этой страницей