привет. в разное время запускается М процессов.
нужно сделать так, чтобы первый "главный" из них получил управление, а все остальные его ждали.
как только "главный" закрывается, процедура повторяется и один из оставшихся получает управление.
Пример. если запустить 2 приложение, то все работает, как нужно. если запустить 3+, то создание мьютекса всегда возвращает ERROR_ALREADY_EXISTS
пробовал ресетить. не особо помогло..
Здравствуйте, sax0n, Вы писали:
S>Пример. если запустить 2 приложение, то все работает, как нужно. если запустить 3+, то создание мьютекса всегда возвращает ERROR_ALREADY_EXISTS
If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership.
S>Пример. если запустить 2 приложение, то все работает, как нужно. если запустить 3+, то создание мьютекса всегда возвращает ERROR_ALREADY_EXISTS S>пробовал ресетить. не особо помогло..
S>
S>for ( ; ; )
S> {
S> }
S>
for не нужен. Убей.. Уберите for.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, sax0n, Вы писали:
S>привет. в разное время запускается М процессов. S>нужно сделать так, чтобы первый "главный" из них получил управление, а все остальные его ждали. S>как только "главный" закрывается, процедура повторяется и один из оставшихся получает управление.
Событие с автоматическим сбросом. "все остальные" ждут его, а главный его установит перед своим окончанием. Теперь один из всех остальных дождется (а какой именно — непредсказуемо), и пусть он перед окончанием сделает то же — дождется какой-то из следующих и т.д., пока они все не пройдут.
Альтернатива — запустить все процессы, кроме главного, с флагом CREATE_SUSPENDED. Главный работает, остальные даже не ждут, а просто приостановлены. Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
With best regards
Pavel Dvorkin
Re[2]: Получение управления несколькими процессами
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
непроходит. Завершение может быть внезапным
---
С уважением,
Сергей Мухин
Re[2]: Получение управления несколькими процессами
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Событие с автоматическим сбросом. "все остальные" ждут его, а главный его установит перед своим окончанием. Теперь один из всех остальных дождется (а какой именно — непредсказуемо), и пусть он перед окончанием сделает то же — дождется какой-то из следующих и т.д., пока они все не пройдут.
На событиях тоже пробовал — ничего не получилось.
В итоге пришлось использовать 2 объекта синхронизации
Все процессы создают событие и ждут его окончания с INFINITE таймаутом. Если завершается с кодом STATUS_WAIT_0 — событие не выставлено — это и будет "главный" процесс. Он с помощью мьютекса захватывает управление, а остальные повторяют процедуру, натываются на на INFINITE и ждут своей очереди
PD>Альтернатива — запустить все процессы, кроме главного, с флагом CREATE_SUSPENDED. Главный работает, остальные даже не ждут, а просто приостановлены. Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
такой вариант не подходит
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
СМ>непроходит. Завершение может быть внезапным
С чего это вдруг ?
With best regards
Pavel Dvorkin
Re[3]: Получение управления несколькими процессами
Здравствуйте, sax0n, Вы писали:
S>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Событие с автоматическим сбросом. "все остальные" ждут его, а главный его установит перед своим окончанием. Теперь один из всех остальных дождется (а какой именно — непредсказуемо), и пусть он перед окончанием сделает то же — дождется какой-то из следующих и т.д., пока они все не пройдут.
S>На событиях тоже пробовал — ничего не получилось.
Что именно не получилось ?
S>В итоге пришлось использовать 2 объекта синхронизации S>Все процессы создают событие и ждут его окончания с INFINITE таймаутом. Если завершается с кодом STATUS_WAIT_0 — событие не выставлено — это и будет "главный" процесс. Он с помощью мьютекса захватывает управление, а остальные повторяют процедуру, натываются на на INFINITE и ждут своей очереди
Ну вообще-то мютекс для управления последовательностью действий — это не то, чтобы очень.
PD>>Альтернатива — запустить все процессы, кроме главного, с флагом CREATE_SUSPENDED. Главный работает, остальные даже не ждут, а просто приостановлены. Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же. S>такой вариант не подходит
Почему ?
With best regards
Pavel Dvorkin
Re[4]: Получение управления несколькими процессами
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
СМ>>непроходит. Завершение может быть внезапным
PD>С чего это вдруг ?
ну убили процесс
---
С уважением,
Сергей Мухин
Re[5]: Получение управления несколькими процессами
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.
СМ>>>непроходит. Завершение может быть внезапным
PD>>С чего это вдруг ?
СМ>ну убили процесс
Против лома нет приема. Впрочем, есть job, но я с ними дела не имел.
With best regards
Pavel Dvorkin
Re[6]: Получение управления несколькими процессами
Я такую конструкцию попробовал в первую очередь. проблема в том, что после получения управления процесс завершался, а я думал, что управление получают сразу все процессы
Спасибо.
Процесс или задада являются объектами ядра, которые могут находиться в отмеченном или нет состоянии. Когда процесс работает, то он находиться в неотмеченном состоянии.т Если процесс закончил работу, то он переходит в отмеченное состояние. Поэтому, для того, чтобы поймать окончания заверщения процесса, достаточно воспользоваться функцией WiatForSingleObject, передав ей в каченстве первого параметра идентификатор процесса, заверщение которого требуется остановит.