Получение управления несколькими процессами
От: sax0n Украина  
Дата: 26.01.11 07:35
Оценка:
привет. в разное время запускается М процессов.
нужно сделать так, чтобы первый "главный" из них получил управление, а все остальные его ждали.
как только "главный" закрывается, процедура повторяется и один из оставшихся получает управление.

Пример. если запустить 2 приложение, то все работает, как нужно. если запустить 3+, то создание мьютекса всегда возвращает ERROR_ALREADY_EXISTS
пробовал ресетить. не особо помогло..

for ( ; ; )
    {
        HANDLE hMutex = CreateMutex( 0, true, L"Mutex1" );
        if ( ERROR_ALREADY_EXISTS == GetLastError() )
        {
            WaitForSingleObject( hMutex, INFINITE );
            CloseHandle( hMutex );
        }
        else
        {
            MessageBox( 0, L"Main", L"", 0 );
            CloseHandle( hMutex );
            return 0;
        }
    }
Re: Получение управления несколькими процессами
От: Сергей Мухин Россия  
Дата: 26.01.11 10:00
Оценка:
Здравствуйте, 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.

---
С уважением,
Сергей Мухин
Re: Получение управления несколькими процессами
От: ononim  
Дата: 26.01.11 10:07
Оценка:
S>Пример. если запустить 2 приложение, то все работает, как нужно. если запустить 3+, то создание мьютекса всегда возвращает ERROR_ALREADY_EXISTS
S>пробовал ресетить. не особо помогло..

S>
S>for ( ; ; )
S>    {
S>    }
S>

for не нужен. Убей.. Уберите for.
Как много веселых ребят, и все делают велосипед...
Re: Получение управления несколькими процессами
От: Pavel Dvorkin Россия  
Дата: 26.01.11 11:27
Оценка: 2 (1)
Здравствуйте, sax0n, Вы писали:

S>привет. в разное время запускается М процессов.

S>нужно сделать так, чтобы первый "главный" из них получил управление, а все остальные его ждали.
S>как только "главный" закрывается, процедура повторяется и один из оставшихся получает управление.

Событие с автоматическим сбросом. "все остальные" ждут его, а главный его установит перед своим окончанием. Теперь один из всех остальных дождется (а какой именно — непредсказуемо), и пусть он перед окончанием сделает то же — дождется какой-то из следующих и т.д., пока они все не пройдут.

Альтернатива — запустить все процессы, кроме главного, с флагом CREATE_SUSPENDED. Главный работает, остальные даже не ждут, а просто приостановлены. Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.

With best regards
Pavel Dvorkin
Re[2]: Получение управления несколькими процессами
От: Сергей Мухин Россия  
Дата: 26.01.11 12:07
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.


непроходит. Завершение может быть внезапным
---
С уважением,
Сергей Мухин
Re[2]: Получение управления несколькими процессами
От: sax0n Украина  
Дата: 26.01.11 12:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Событие с автоматическим сбросом. "все остальные" ждут его, а главный его установит перед своим окончанием. Теперь один из всех остальных дождется (а какой именно — непредсказуемо), и пусть он перед окончанием сделает то же — дождется какой-то из следующих и т.д., пока они все не пройдут.


На событиях тоже пробовал — ничего не получилось.
В итоге пришлось использовать 2 объекта синхронизации
Все процессы создают событие и ждут его окончания с INFINITE таймаутом. Если завершается с кодом STATUS_WAIT_0 — событие не выставлено — это и будет "главный" процесс. Он с помощью мьютекса захватывает управление, а остальные повторяют процедуру, натываются на на INFINITE и ждут своей очереди



PD>Альтернатива — запустить все процессы, кроме главного, с флагом CREATE_SUSPENDED. Главный работает, остальные даже не ждут, а просто приостановлены. Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.

такой вариант не подходит
Re: Получение управления несколькими процессами
От: okman Беларусь https://searchinform.ru/
Дата: 26.01.11 12:27
Оценка: 2 (1) +2
Здравствуйте, sax0n.

В чем, собственно, проблема ?
Почему вот такой, к примеру, код не подходит ?

HANDLE hMutex(CreateMutexW(NULL, TRUE, L"MyMutexName"));

if (hMutex == NULL)
{
    return EXIT_FAILURE;
}

if (GetLastError() == ERROR_ALREADY_EXISTS)
{
    WaitForSingleObject(hMutex, INFINITE);
}

MessageBoxW(0, L"Hello !", L"Message", MB_OK);
CloseHandle(hMutex);
return EXIT_SUCCESS;
Re[3]: Получение управления несколькими процессами
От: Pavel Dvorkin Россия  
Дата: 26.01.11 12:32
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.


СМ>непроходит. Завершение может быть внезапным


С чего это вдруг ?
With best regards
Pavel Dvorkin
Re[3]: Получение управления несколькими процессами
От: Pavel Dvorkin Россия  
Дата: 26.01.11 12:34
Оценка:
Здравствуйте, 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]: Получение управления несколькими процессами
От: Сергей Мухин Россия  
Дата: 26.01.11 12:43
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.


СМ>>непроходит. Завершение может быть внезапным


PD>С чего это вдруг ?


ну убили процесс
---
С уважением,
Сергей Мухин
Re[5]: Получение управления несколькими процессами
От: Pavel Dvorkin Россия  
Дата: 26.01.11 12:51
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>>>Перед окончанием главный выбирает себе прееемника и отпускает его поток. Преемник в свою очередь перед смертью делает то же.


СМ>>>непроходит. Завершение может быть внезапным


PD>>С чего это вдруг ?


СМ>ну убили процесс


Против лома нет приема. Впрочем, есть job, но я с ними дела не имел.
With best regards
Pavel Dvorkin
Re[6]: Получение управления несколькими процессами
От: Jolly Roger  
Дата: 26.01.11 13:26
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

СМ>>ну убили процесс


PD>Против лома нет приема.


Вообще-то в данном случае есть С мьютексом сработает и при убийстве.
"Нормальные герои всегда идут в обход!"
Re[2]: Получение управления несколькими процессами
От: sax0n Украина  
Дата: 26.01.11 13:29
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, sax0n.


O>В чем, собственно, проблема ?

O>Почему вот такой, к примеру, код не подходит ?

O>
O>HANDLE hMutex(CreateMutexW(NULL, TRUE, L"MyMutexName"));

O>if (hMutex == NULL)
O>{
O>    return EXIT_FAILURE;
O>}

O>if (GetLastError() == ERROR_ALREADY_EXISTS)
O>{
O>    WaitForSingleObject(hMutex, INFINITE);
O>}

O>MessageBoxW(0, L"Hello !", L"Message", MB_OK);
O>CloseHandle(hMutex);
O>return EXIT_SUCCESS;
O>


Я такую конструкцию попробовал в первую очередь. проблема в том, что после получения управления процесс завершался, а я думал, что управление получают сразу все процессы
Спасибо.
Re: Получение управления несколькими процессами
От: Melamed Россия  
Дата: 26.01.11 20:15
Оценка:
Процесс или задада являются объектами ядра, которые могут находиться в отмеченном или нет состоянии. Когда процесс работает, то он находиться в неотмеченном состоянии.т Если процесс закончил работу, то он переходит в отмеченное состояние. Поэтому, для того, чтобы поймать окончания заверщения процесса, достаточно воспользоваться функцией WiatForSingleObject, передав ей в каченстве первого параметра идентификатор процесса, заверщение которого требуется остановит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.