Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Автоматический перезапуск программы при изменении настроек

Автор: vovanzp
Дата сообщения: 16.05.2006 11:28
Кто знает, как можно реализовать такую вещь: вообщем в программе когда пользователь изменяет настройки, ему выдается сообщение о том, что необходимо перезапустить программу. Если юзер ответил да, то - программа закрывается, и нужно её заново запускать. А можно сделать так, что программа например создавала bat файл перед этой операцией и как только пользователь завершал работу, запускался bat файл который запускал бы программу мою, после чего автоматически удалялся? заранее спасибо.
Автор: OdesitVadim
Дата сообщения: 16.05.2006 12:40
А в чём проблема? Создать текстовый документ или в батанике (искустве создавать bat файлы)?
вот такой должен подойти.
app.exe
del app.bat

где app.exe - имя твоей программы
app.bat - твой батник
Автор: vovanzp
Дата сообщения: 16.05.2006 12:43
OdesitVadim
проблема в том, как сделать так, что бы этот файл запустился только после закрытия программы?
Автор: OdesitVadim
Дата сообщения: 16.05.2006 13:36
vovanzp
А кто мешает тебе его самостоятельно запустить в FormClose?
Автор: dneprcomp
Дата сообщения: 17.05.2006 02:03
vovanzp
Можно еще добавить задержку времени в bat для гарантированного закрытия программы.
Собственно можно сделать еще веселее. Добавить еще один ехешник, который будет перезапускать программу. Тогда его можно вызывать не только на FormClose(OdesitVadim), а в любой момент. И пусть он проверяет есть app.exe в памяти или уже пора запускать.
Автор: OdesitVadim
Дата сообщения: 17.05.2006 10:26
dneprcomp

Цитата:
Добавить еще один ехешник, который будет перезапускать программу.

Я так всегда делаю. А вот в человека появляться вопросы "как убрать консольное окно", "как сделать ещё что то".
Автор: vovanzp
Дата сообщения: 17.05.2006 11:20
dneprcomp
действительно, как закрыть консольное оконо bat файла?
Автор: OdesitVadim
Дата сообщения: 17.05.2006 11:59
В этом случае (тоесть когда мы запускали как батник для перезапуска)?
Это надо в свойствах батника проставить автоматически закрываться. Но конкретно для этого ты так просто не поставишь, поэтому нужно открыть свойства любого батника и настроить это там и при запросе применить только к этому файлу или всем остальным, нужно казать - "ко всем". Правда если ты собираешся распространять своё приложение, то это может быть недопустимым.
Автор: dyr farot
Дата сообщения: 17.05.2006 12:37
не понял я прикола.
а просто запустить второй экземпляр программы после чего благополучно умереть -- не интересно?
Автор: OdesitVadim
Дата сообщения: 17.05.2006 13:06
dyr farot
Ну в некоторых случаях надо сделать дополнительные действия - тут дополнительная прога к стати. У меня к примеру работает следующая связка. Прога активно передаёт по сети. Как следствие - время от времени подвисает (работает она 24 часа в сутки, а подвиснуть может раз в месяц). Вторая прога следит за этой и если заметила что -то не то, то запускает прогу-камикадзе. Та убивает извращённым способом (она подключается к ней как отладчик, а потом себя убивает - видновс автоматом прибёт и отлажываемый процесс - работает отлично). В это время вторая следит за этим и если камикадзе не справляется с поставленой задачей, то перегружает комп. После этого запускается "стартер", который закрывает высячие соединения, делает "зачистку" остатков, а также посылает по сети другой проге, которая принимала данные, что у нас тут были проблемы. И запускает снова прогу. Выглядит страшно, но работает на ура. Со стороны выглядит красиво, особенно если проги на соседних компах.
Автор: vovanzp
Дата сообщения: 17.05.2006 13:35
dyr farot
в программе имеется защита от запуска второго экземпляра пограммы
Автор: dyr farot
Дата сообщения: 17.05.2006 14:00
при выходе создавай мьютекс а в защите смотри создан он или нет; если создан -- допускать создание второго экземпляра...
Автор: OdesitVadim
Дата сообщения: 17.05.2006 14:30
vovanzp

Цитата:
в программе имеется защита от запуска второго экземпляра пограммы

Так кто мешает использовать его в нужных целях?
Обычно код проверки на запущеность выглядит так

Код:
if @AppRun@ then exit;//или активация предыдущей копии
Автор: Mickey_from_nsk
Дата сообщения: 17.05.2006 14:35
Мои 5 копеек. При запуске приложению можно указывать PID порождающего процесса (даже сам процесс может выяснить PID родителя, если не ошибаюсь). Приложение может подождать, пока процесс-родитель не умрет, а затем благополучно активироваться.
Автор: OdesitVadim
Дата сообщения: 17.05.2006 15:04
Mickey_from_nsk
Только надо вставить проверку на то, что родителем не является Exporer, а то получиться забавный глюк.
Автор: dneprcomp
Дата сообщения: 17.05.2006 21:09
vovanzp
А ты не пробовал просто написать exit ?

Добавлено:
OdesitVadim
Если держать проверяющий процесс все время в памяти, то тогда лучше использовать WaitForSingleObject вместо Sleep. Что-нибудь в таком роде:

Код: Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Public Sub WaitForTerm(varTemp As Variant)
Dim phnd&
phnd = OpenProcess(SYNCHRONIZE, 0, varTempor)
If phnd <> 0 Then
Call WaitForSingleObject(phnd, INFINITE)
Call CloseHandle(phnd)
End If

'запуск контролируемой программы из висящей в памяти
varTemp = Shell((запускаемая программа), vbMaximizedFocus)

'ждем, пока программа не уйдет из памяти
WaitForTerm varTemp

'запускаем по новой и повторяем цикл
End Sub
Автор: ShIvADeSt
Дата сообщения: 18.05.2006 00:59
dneprcomp

Цитата:
То, что забавный, я чуствую Но лень проверять. Как будет выглядеть?

Процесс будет ждать пока не умрет родитель, то есть експлорер, короче при завершении работы винды он запустится как раз тогда проводник умрет.
А вообще можно сделать проще ИМХО, тут уже говорили насчет PIDов, то есть программа при старте анализирует командную строку, если в качестве параметра есть число, то делаем TerminateProcess с этим числом (правда блин если не админ, то может прав не хватить).
dyr farot

Цитата:
при выходе создавай мьютекс а в защите смотри создан он или нет; если создан -- допускать создание второго экземпляра...

когда надо рестартнуть создаем Атом Прога1, запускаем второй эксземпляр, он смотрит, что есть мьютекс и создает Атом Прога2, (в этот момент первая прога смотрит его наличие в системе, если есть, то закрываем первый Атом и выход). А второй экземпляр смотрит наличие первого атома, как только он исчез, закрываем второй и создаем первый. Либо можно проще, при старте софтины посылается бродкаст (я надеюсь софтина оконная) со своим типом сообщения, как только приложение его ловит оно завершает свою работу, хотя тут нужно сделать всетаки дополнительное создание мьютекса, чтобы простой повторный запуск не грохнул основной процесс. Короче первый мой вариант мне больше нравится.
Автор: dneprcomp
Дата сообщения: 18.05.2006 03:46
ShIvADeSt

Цитата:
Процесс будет ждать пока не умрет родитель, то есть експлорер, короче при завершении работы винды он запустится
Тогда это не так интересно. Я думал, что он не даст винде выключится. Или закольцует что-нибудь.
Автор: Mickey_from_nsk
Дата сообщения: 18.05.2006 07:03
OdesitVadim
Вернее, надо проверить, что родителем является само приложение Мало ли кто захочет его запустить.
Автор: OdesitVadim
Дата сообщения: 18.05.2006 11:36
dneprcomp

Цитата:
То, что забавный, я чуствую Но лень проверять. Как будет выглядеть?

Если точнее, то будет следующее. Винды пойдут на завершение. Возможно даже увидишь "завершение работы" (всё зависит от росторопности винды в конкретном случае). А дальше два сценария
1) Приложение запускается и сразу прибивается как зависшее.
2) Приложение не будет запущено и будет выведено сообщение "Не удалось инициализировать из за останова станции" (ну или почти такое, непомню)
Автор: vovanzp
Дата сообщения: 18.05.2006 12:36
dneprcomp
пробывал набрать exit Но окно не закрылось всеравно
Автор: OdesitVadim
Дата сообщения: 18.05.2006 16:47
vovanzp
А оно и не закроется. Потому что не обязано. Внимательно читай, то что я писал про батники.
Если для твоего батника не применены особые настройки (если динамически создаёш то настройки по умолчанию), то поведение батника будет описываться pif файлом. он кажеться называется _default.pif и находиться в папке windows. Щёлкаеш по нём правой кнопкой миши и смотриш свойства на вкладке "Программа". Там есть галочка "Закрыть окно по завершению". Если она будет снята, но не будет окно закрываться.
Автор: PaNov
Дата сообщения: 19.05.2006 13:57
для более "правильного" убиения процесса можно пользовать утилиту pskill из комплекта SysInternals, вот линк: http://www.sysinternals.com/ProcessesAndThreadsUtilities.html
убивает - намертво, сам этим активно пользуюсь.
вот её параметры:

Usage: pskill [-t] [\\computer [-u username [-p password]]] <process ID | name>
-t Kill the process and its descendants.
-u Specifies optional user name for login to
remote computer.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.

Автор: OdesitVadim
Дата сообщения: 19.05.2006 14:11
PaNov
В данном случае эта программа мало поможет. Как себе представляеш процес прибивания батника. Кто запустит pskill?
Автор: gerrCrazzy
Дата сообщения: 20.05.2006 13:44
Фигасе навелосипедили
Короче есть готовое решение в софтине nnCron, тулза называется nnguard (используется
для так называемого "непотопляемого режима"). В оригинале запускается следующим образом:
Код: nnguard.exe <PID nncron> net start nncron
Автор: vovanzp
Дата сообщения: 20.05.2006 17:54
gerrCrazzy
что-то нашел на яндексе но там все с Unix связано

попробую еще поискать, есть вопрос не потеме: как можно запретить MDIForm использовать полосы прокрутки?
Автор: gerrCrazzy
Дата сообщения: 22.05.2006 14:31
vovanzp, собственно я имел ввиду этот nncron, да и к самой проге как таковой моё решение имеет самое косвенное отношение(имел ввиду тулзень входящую в дистрибутив).

Страницы: 1

Предыдущая тема: Как распечатать из Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.