Как ожидать выхода недочерних процессов

Вам нужно будет зарегистрировать PropertyChangedCallback с метаданными свойств.

Причина в том, что свойства зависимостей, установленные в XAML или привязками или каким-либо другим источником, не вызывают оболочку CLR (метод сеттера). Причина объясняется в статье XAML по загрузке и зависимости свойств в MSDN:

. По соображениям реализации, это вычислительно дешевле для идентификации свойства как свойства зависимостей и получить доступ к методу SetValue системы свойств, чтобы установить его, а не использовать оболочку свойств и ее сеттер.

...

Поскольку текущая реализация WPF поведения процессора XAML для настройки свойств полностью обходит оболочки, вы не должны вводить какую-либо дополнительную логику в определения множества обертки для вашего пользовательского свойства зависимостей. Если вы установите такую ​​логику в определение набора, тогда логика не будет выполняться, если свойство задано в XAML, а не в коде.

blockquote>

Ваш код должен выглядеть так:

public static readonly DependencyProperty IsClosedProperty =
    DependencyProperty.Register(
        "IsClosed", typeof(bool), typeof(GroupBox),
        new FrameworkPropertyMetadata(false,
            FrameworkPropertyMetadataOptions.AffectsRender,
            (o, e) => ((GroupBox)o).OnIsClosedChanged()));

public bool IsClosed
{
    get { return (bool)GetValue(IsClosedProperty); }
    set { SetValue(IsClosedProperty, value); }
}

private void OnIsClosedChanged()
{
    _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
}

30
задан chaos 21 July 2009 в 07:51
поделиться

5 ответов

Нет ничего эквивалентного wait () . Обычной практикой является опрос с использованием kill (pid, 0) и поиск возвращаемого значения -1 и errno из ESRCH , чтобы указать, что процесс завершен.

26
ответ дан 27 November 2019 в 23:37
поделиться

Может быть, можно подождать, пока / proc / [pid] или / proc / [pid] / [что-то] исчезнет?

Есть функции poll () и другие функции ожидания событий файла, может быть что может помочь?

1
ответ дан Talkless 11 October 2019 в 13:24
поделиться

На BSD и OS X вы можете использовать kqueue с EVFILT_PROC + NOTE_EXIT, чтобы сделать именно это. Опрос не требуется. К сожалению, нет Linux-эквивалента.

13
ответ дан Hongli 11 October 2019 в 13:24
поделиться

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

Если у вас есть доступ к источнику дочернего элемента, откройте FIFO для записи при его запуске, а затем просто забудьте об этом. ОС очистит дескриптор открытого файла, когда дочерний процесс завершится, и ваш ожидающий «родительский» процесс проснется.

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

6
ответ дан 27 November 2019 в 23:37
поделиться

Мне неизвестно. Помимо решения проблемы хаоса, вы можете использовать семафоры, если можете изменить программу, которую хотите дождаться.

Библиотечные функции: sem_open (3) , sem_init (3), sem_wait (3), ...

sem_wait (3) выполняет ожидание, поэтому вам не нужно выполнять ожидание, как в случае с хаосом. Конечно, использование семафоров делает ваши программы более сложными, и, возможно, это не того стоит.

2
ответ дан 27 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

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