Показать сообщение отдельно
  #82 (permalink)  
Старый 06.01.2023, 16:03
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Вся реализация со списком Не отлаживал, конечно, но как то так
class CPoolItem {
    next = null;
    prev = null;
    operation;

    constructor (operation) {
        this.operation = operation;
    }
}

class CPool {
    first = null;
    last = null;
    constructor () {}

    // добавить в конец
    add (item) {
        this.fist ??= item;
        item.prev = this.last;
        if (this.last) 
            this.last.next = item;
        this.last = item;
        return this;
    }

    // удалить item
    delete (item) {
        const next = item.next;
        const prev = item.prev;
        if (!prev)
            this.first = next;
        else 
            prev.next = next;
        if (!next)
            this.last = prev;
        else
            next.prev = prev;
        return this;
    }
    // последовательно просмотреть pool, выполняя операции, какие возможно.
    view () {
        let item = this.first;
        while (item) {
            if (canExec(item.operation)) {
                exec (item.operation);
                this.delete(item)
            }
            item = item.next
        }
    }
}

const pool = new CPool();

// Когда поcтупила новая операция делаем
poll.add(new CPoolItem(operation));
pool.view();

// Когда какая то операция выполнилась удаляем участников из буфера и делаем
pool.view();

// canExec(operation) проверяет, что участников операции нет в буфере
// exec (operation) добавляет участников в буфер и отправляет операцию на исполнение.

Последний раз редактировалось voraa, 06.01.2023 в 16:22.
Ответить с цитированием