Как я останавливаю сервисное приложение окон от потока?

Используйте смешанный стиль; например не делайте данные частью узла, а узлом - частью данных:

struct avl_node {
    struct avl_node *parent;
    struct avl_node *left;
    struct avl_node *right;
};

struct person {
    char const *name;
    struct avl_node node;
};

struct animal {
    struct avl_node node;
    int dangerousness;
};

Конструкторы для animal похожи на

struct animal *animal_create(double d)
{
    struct animal *animal = malloc(sizeof *animal);

    *animal = (struct animal) {
        .node = AVL_NODE_INIT(),
        .dangerousness = d,
    };

    return animal;
}

Общие операции дерева AVL могут выглядеть как [ 119]

void avl_tree_insert(struct avl_node **root, struct avl_node *node, 
                     int (*cmp)(struct avl_node const *a, struct avl_node const *b))
{
    /* .... */
}

и функция cmp для animal, как

int animal_cmp(struct avl_node const *a_, struct avl_node const *b_)
{
     struct animal const *a = container_of(a_, struct animal, node);
     struct animal const *b = container_of(b_, struct animal, node);

     return a->dangerousness - b->dangerousness;
}
8
задан Jorge Córdoba 25 February 2009 в 17:47
поделиться

2 ответа

Самое легкое и, по-моему, самый чистый путь состоит в том, чтобы использовать общедоступное статическое свойство класса обслуживания. Единственное время это не будет работать, - то, при использовании того же класса обслуживания для выполнения многочисленных услуг в том же процессе, что-то, что очень редко.

private static MyService m_ServiceInstance;

public static MyService ServiceInstance
{
    get { return m_ServiceInstance; }
}

public MyService()
{
    InitializeComponents();
    //Other initialization
    m_ServiceInstance = this;
}

Введение сервисного экземпляра в каждый метод, для которого мог возможно быть нужным он, является альтернативой, но это может быстро стать грязным, и это не имеет никаких реальных преимуществ просто использование статического свойства.

10
ответ дан 5 December 2019 в 17:41
поделиться

Проверьте пример здесь на то, как использовать класс ServiceController, чтобы запустить и остановить сервисы.

С другой стороны, Вы могли передать свой сервисный экземпляр потоку, когда Вы создаете его (или установите его как переменную экземпляра в классе потока, и т.д.), не имея необходимость делать Ваш класс обслуживания статичным.

Короткий пример для полноты:

ServiceController sc = new ServiceController("MyService");
sc.Stop();
0
ответ дан 5 December 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: