Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принцип работы "обертки" программы, натолкните на идею 
:(
    Опции темы
Akina
  Дата 27.7.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Имеется некая программа. Она может запускаться в различных конфигурациях, которые определяются конкретным запуском (строго НЕинтерактивно на уровне запускаемого приложения) - например с разными параметрами командной строки, из разных каталогов, несколько старт-модулей, запускающих главный модуль в особой среде и пр. Это происходит в ОС семейства WindowsNT.

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

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

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

Помогите разработать алгоритм регистрации и верификации работающих конфигураций...

========================================================

Пока есть приблизительно такая мысль - где-то в недрах системы (скажем в реестре) пытаться сохранять информацию о запущенных конфигурациях (номер конфигурации, имя главного окна, SID процесса, время запуска...) и при каждом запуске сверяться с этим списком, одновременно производя верификацию этих данных... если есть мысли по развитию/детализации, конструктивная критика, свои соображения по реализации - пожалуйста.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 27.7.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата
Сложности - во-первых, нет ограничения на тип запускаемого приложения (ДОС, консольное, оконное, безоконное)

не уверен, но разве важно, какой тип приложения, для функций типа ShellExecute или CreateProcess?
Цитата
во-вторых, в любой момент любая из конфигураций может скоропостижно покинуть RAM, не успев об этом сообщить

ну процесс в любом случае пропадет (или программа может некорректно завершиться, оставшись в памяти?)
а значит, всякие функции типа WaitForSingleObject, по идее, должны работать

Добавлено @ 11:10



--------------------
qqq
PM WWW   Вверх
S.A.P.
Дата 27.7.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Akina в Windows NT есть Мьютексы - это вроде уникального сосотяния в системе в виде строки, может это подойдет?
PM MAIL   Вверх
Akina
Дата 27.7.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Perchilla
мьютекс, как я понимаю, один на систему... и потом - мало ли как остальные процессы в системе будут его использовать? то есть в качестве хранилища вместо того же реестра он, наверное, может быть использован... однако хочется организовать это максимально простыми средствами, не опускаясь до работы с тредами - собсно нужна идея, которая выдержит испытание "на разрыв", о ее программной реализации пока вопрос не стоИт, надо понять КАК.

Цитата(maxim1000 @ 27.7.2005, 12:01)
разве важно, какой тип приложения

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

Цитата(maxim1000 @ 27.7.2005, 12:01)
всякие функции типа WaitForSingleObject, по идее, должны работать

Скоропостижная смерть ака выгрузка возможны, пугает
Цитата
If this handle is closed while the wait is still pending, the function's behavior is undefined.





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 27.7.2005, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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

я имел в виду привязаться к HANDLE процесса (его можно получить при использовании CreateProcess и, по-моему, ShellExecute)
Цитата
If this handle is closed while the wait is still pending, the function's behavior is undefined

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


--------------------
qqq
PM WWW   Вверх
Се ля ви
Дата 28.7.2005, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Цитата(Akina @ 27.7.2005, 12:27)
не опускаясь до работы с тредами

А что плохого в тредах?

Если всё это реализовывать на Java, то можно достаточно элегантно ситуацию разрулить в виде тредов. Правда, тогда понадобится некоторый общий процесс, через который будут запускаться все конфигурации, организованные в виде тредов. Он бы в карте хранил всю информацию о тредах и их конфигурациях и страховал бы от дублирования тредов с одинаковой конфигурацией, а мёртвые треды удалял бы из карты. Этот процесс мог бы удаляться, когда видит, что все треды умерли, автоматически.

Наверняка похожим образом можно и в .NET`е сделать.

Если это совсем неприемлемо, тогда не знаю... smile


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
Дрон
Дата 28.7.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 93



Цитата(Akina @ 27.7.2005, 11:27)
Пока есть приблизительно такая мысль - где-то в недрах системы (скажем в реестре) пытаться сохранять информацию о запущенных конфигурациях (номер конфигурации, имя главного окна, SID процесса, время запуска...) и при каждом запуске сверяться с этим списком, одновременно производя верификацию этих данных... если есть мысли по развитию/детализации, конструктивная критика, свои соображения по реализации - пожалуйста.

Ну так использование Mutexов это практически то же самое, только гораздо естественней! smile

Для каждой конфигурации создаётся мьютекс с уникальным именем.

Например: MyApplicationMutexNNN, где NNN - номер конфигурации.

Примерно так:
Код

char str[256];
sprintf(str,"MyApplicationMutex%i", iConfigCode);
HANDLE hConfigMutex = CreateMutex(NULL, TRUE, str);
if (GetLastError() == ERROR_ALREADY_EXISTS)
    throw ("Эта конфигурация уже запущена!!!");

Никаких потоков, никаких усложнений -- обычная системная функция.



--------------------
Да. Именно так.
PM   Вверх
Akina
Дата 28.7.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата
понадобится некоторый общий процесс

Как я уже сказал, любой процесс может умереть, в т.ч. этот. При старте следующей копии приложения запустится копия этого общего процесса, не найдя себя в памяти, она останется... но откуда она возьмет данные о том что ДО НЕЕ было запущено? и проверит что между смертью ее предшественника и ее собсным стартом не был завершен один из экземпляров? и что эта скоропостижная смерть предшественника - не нажатие на ресет...

Цитата
Для каждой конфигурации создаётся мьютекс с уникальным именем

А как он себя поведет при внезапной смерти экземпляра приложения, для которого создан? тоже помре?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Дрон
Дата 28.7.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 93



Akina
Цитата(Akina @ 28.7.2005, 18:45)
А как он себя поведет при внезапной смерти экземпляра приложения, для которого создан? тоже помре?

Вот не помню.

Скорее всего да. Когда процесс закрывается все HANDLE открытые в нём тоже закрываются. Когда закроется последний хэндл мьютекс будет уничтожен.

Даже если по каким-то причинам (фаза Луны, например) не уничтожат после закрытия процесса, то можно сделать такую проверку (и это, наверно, даже более правильный способ):
Код

char str[256];
sprintf(str,"MyApplicationMutex%i", iConfigCode);
HANDLE hConfigMutex = CreateMutex(NULL, TRUE, str);
if (WaitForSingleObject(hConfigMutex, 0) == WAIT_TIMEOUT)
       throw ("Эта конфигурация уже запущена!!!");

Т.е. я вместо GetLastError просто проверяю: свободен ли мьютекс или нет.
Если мы его создали впервые, то мы и являемся его хозяинов и Wait вернёт WAIT_OBJECT_0.
Если кто-то другой его создал и его хозяин, то вернёт WAIT_TIMEOUT.
А если его хозяин уже подох, а мьютех ещё существует, то WaitForSingleObject возвращает WAIT_ABANDONED.

Это сообщение отредактировал(а) Дрон - 28.7.2005, 18:05


--------------------
Да. Именно так.
PM   Вверх
Се ля ви
Дата 29.7.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 3
Всего: 127



Цитата(Akina @ 28.7.2005, 17:45)
Цитата (Се ля ви @ 28.7.2005, 01:03)
понадобится некоторый общий процесс

Как я уже сказал, любой процесс может умереть, в т.ч. этот. При старте следующей копии приложения запустится копия этого общего процесса, не найдя себя в памяти, она останется... но откуда она возьмет данные о том что ДО НЕЕ было запущено? и проверит что между смертью ее предшественника и ее собсным стартом не был завершен один из экземпляров? и что эта скоропостижная смерть предшественника - не нажатие на ресет...

Ну, например, свою карту она может сериализовывать в базу или на диск в специальную папку при каждом изменении и/или циклически через фиксированный интервал времяни - тогда даже если процесс умрёт, он сможет восстановить всю информацию о работающих тредах. Вроде, был такой способ сериализации, когда остаются ссылки на объекты, а не сериализуется всё дерево...


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
maxim1000
Дата 29.7.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



кстати, а с какой радости обертка умрет?
какие бы глюки ни были в порожденном процессе, на главный это повлиять не должно...


--------------------
qqq
PM WWW   Вверх
Akina
Дата 29.7.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Цитата(maxim1000 @ 29.7.2005, 13:09)
а с какой радости обертка умрет? какие бы глюки ни были в порожденном процессе, на главный это повлиять не должно...

Нет, помереть он может сам, без вмешательства извне... в том и дело, что надо предусмотреть все мыслимые и немыслимые варианты и их сочетания.
Это же под Windows...

Цитата
Если мы его создали впервые, то мы и являемся его хозяинов и Wait вернёт WAIT_OBJECT_0.
Если кто-то другой его создал и его хозяин, то вернёт WAIT_TIMEOUT.
А если его хозяин уже подох, а мьютех ещё существует, то WaitForSingleObject возвращает WAIT_ABANDONED.

О! уже ближе к телу... спасибо...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Системный анализ, проектирование и UML"
Се ля ви

Форум "Системный анализ, проектирование и UML" предназначен для обсуждения вопросов, так или иначе связанных с этапами жизненного цикла автоматизированных (программных, информационных, автоматических) систем:

• предпроектные обследования объектов автоматизации;

• разработка концепции создания систем;

• моделирование бизнес-процессов (в т.ч. на UML);

• проектирование архитектуры систем;

• управление проектами;

• управление качеством;

• CASE-средства;

• реинжиниринг.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Системный анализ, проектирование и UML | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.