Не должно быть возможности запускать несколько экземпляров моего приложения. Таким образом, исходный код проекта содержит:
CreateMutex (nil, False, PChar (ID)); if (GetLastError = ERROR_ALREADY_EXISTS) then Halt;
Теперь я хочу программно перезапустить свое приложение. Обычный способ:
AppName := PChar(Application.ExeName) ; ShellExecute(Handle,’open’, AppName, nil, nil, SW_SHOWNORMAL) ; Application.Terminate;
Но в моем случае это не сработает из-за мьютекса. Даже если я отпущу мьютекс перед запуском второго экземпляра, он не сработает, потому что завершение работы занимает некоторое время, и два экземпляра не могут работать параллельно (из-за общих ресурсов и других эффектов).
Есть ли способ перезапустить приложение с такими характеристиками? (По возможности без дополнительного исполняемого файла)
jpfollenius 21 Дек 2010 в 13:26
Зачем перезапускать — достаточно активировать уже запущенный инстанс
21 Дек 2010 в 13:46
Как это то же самое? Работающий экземпляр уже активен, и я хочу, чтобы он был перезапущен.
jpfollenius
21 Дек 2010 в 14:02
Вы когда-нибудь тестировали возврат «ReleaseMutex»?
Sertac Akyuz
21 Дек 2010 в 16:18
Перезагрузка приложения (DElphi) Restart application
Освобождение — это не то, что вам нужно делать с мьютексом. Вместо этого закройте его.
Rob Kennedy
21 Дек 2010 в 20:03
9 ответов
Лучший ответ
Возможно, вам следует мыслить нестандартно. Вместо того, чтобы возиться с логикой мьютекса / экземпляра, вы можете просто создать другой исполняемый файл, который ожидает закрытия вашего приложения, а затем запускает его снова. В качестве дополнительного бонуса вы можете позже использовать этот механизм, например, для обновления некоторых двоичных файлов вашего основного приложения. Кроме того, гораздо проще запускать его с повышенными правами вместо поддержания разных уровней целостности внутри одного и того же приложения и т. Д.
Mihai Limbășan 21 Дек 2010 в 16:47
+1; Это механизм, который используют многие приложения для выполнения обновлений.
Jeroen Wiert Pluimers
21 Дек 2010 в 16:57
Почему нельзя просто отпустить мьютекс перед попыткой перезапуска? Если по какой-то случайности другой экземпляр запускается перед тем, который вы явно вызываете с перезапуском, который не имеет значения, ваше приложение все равно будет запущено и снова запустится с любыми внесенными изменениями, которые потребовали перезапуска. Я не думаю, что вам нужна сложность других решений.
David Heffernan 21 Дек 2010 в 13:51
Потому что в течение некоторого ограниченного времени два экземпляра будут работать параллельно (отключение занимает некоторое время). Вот чего я хочу избежать.
jpfollenius
21 Дек 2010 в 13:53
Поэтому вам нужно выключить и перезапустить, или будет достаточно повторной активации уже запущенного приложения (посмотрите на ссылку, которую я разместил)?
21 Дек 2010 в 13:56
В этом случае выполните все действия по отключению, которые вам нужно выполнить в режиме одного экземпляра, а затем, после завершения всей работы по отключению, освободите мьютекс и вызовите ShellExecute.
Обновление прошивки тестера Delphi D-150 Китай для программы Автоком (Autocom)
David Heffernan
21 Дек 2010 в 13:58
Все, что вам нужно сделать, это поместить ShellExecute после существующего освобождения мьютекса. Предположительно, вы уже делаете всю работу по отключению, прежде чем освободить существующий мьютекс?
David Heffernan
21 Дек 2010 в 14:23
jpfollenius
21 Дек 2010 в 14:26
ХОРОШО. Теперь я верю, что знаю, в чем ваша проблема . У вас проблемы с доработкой программных модулей!
Попробуйте добавить в раздел программы как первый модуль мой нижний модуль RestartMutex.
program MyProgramName; uses Mutex, Forms, .
unit RestartMutex; interface var Restart: boolean = false; implementation uses windows, ShellApi; var MutexHandle: cardinal; AppName: PChar; const ; initialization MutexHandle := CreateMutex (nil, False, PChar (ID)); if (GetLastError = ERROR_ALREADY_EXISTS) then Halt; finalization ReleaseMutex(MutexHandle); if Restart then begin AppName := PChar(‘MyProgramName.exe’) ; ShellExecute(0,’open’, AppName, nil, nil, SW_SHOWNORMAL) ; end: end.
Если вы хотите перезапустить приложение, просто установите для переменной Restart значение true, а затем закройте приложение.
Итак, поскольку RestartMutex добавлен первым в разделе программы, это будет означать, что завершение модуля RestartMutex будет выполнено почти в конце закрытия приложения, а все остальные модули будут выполнять завершение перед модулем RestartMutex, что означает, что приложение может снова запуститься безопасно!
GJ. 23 Дек 2010 в 12:16
«Даже если я отпущу мьютекс перед запуском второго экземпляра, он не будет работать, потому что отключение занимает некоторое время, а два экземпляра не могут работать параллельно»… из вопроса.
Источник: question-it.com
Как перезагрузить программу delphi
Написал простенькую игру на Delphi, там я создал пункт в меню — «Новая игра». Как можно сделать перезапуск программмы с самого начала? погуглил, ничего такого не нашел.
Trust no one.
Регистрация: 07.04.2009
Сообщений: 6,526
Создай процедуру обнуления всех переменных и фсе.
SQUARY PROJECT — НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK — УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Форумчанин
Регистрация: 30.07.2009
Сообщений: 256
Не подойдет, там у меня такая структура, что если занулить переменную с очками, то если игра закончилась не на четном кол-ве очков, то дальнейшая работа невозмажна. Впринципе, конечно можно снова задавать начальные координаты и т.п. Но хотелось более быстрого способа. Мне кажется, что должна быть процедура перезапуска программы.
Регистрация: 29.09.2009
Сообщений: 9,742
под обнулением вам хотели сказать- верните начальные установки
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer var FullProgPath: PChar; begin FullProgPath:=PChar(Application.ExeName); WinExec(FullProgPath,SW_SHOW); Application.Terminate; end;
Полностью перезапускает(Restart) программу.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
Источник: www.programmersforum.ru
Закройте и перезапустите текущее приложение в DELPHI
Как я могу сделать это?
По какой-то причине или выбранный пользователем «попросите» текущее приложение перезапустить его самостоятельно.
спросил(а) 2011-05-16T20:11:00+04:00 12 лет, 1 месяц назад
добавить комментарий
пожаловаться
uses ShellAPI;
.
procedure TForm1.RestartThisApp;
begin
ShellExecute(Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Application.Terminate; // or, if this is the main form, simply Close;
end;
ответил(а) 2011-05-16T20:14:00+04:00 12 лет, 1 месяц назад
добавить комментарий
пожаловаться
if FirstRun then
begin
DoFirstRunStuff();
ShellExecute(Application.Handle, nil, PChar(Application.ExeName), nil, nil, SW_SHOWNORMAL);
Halt(0);
end;
.
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
ответил(а) 2014-11-05T21:53:00+03:00 8 лет, 8 месяцев назад
добавить комментарий
пожаловаться
-
сначала получить системное время
установить запланированное задание через некоторое время после этого времени (запланированное событие должно будет запустить ваш исполняемый файл)
выйти из приложения (закрытие основной формы или application.terminate сделает это)
-
проверить любые запланированные задачи, созданные вашим исполняемым файлом
удалить их
ответил(а) 2011-05-17T10:44:00+04:00 12 лет, 1 месяц назад
добавить комментарий
пожаловаться
У вас может быть отдельная простая программа restart.exe, которую вы запускаете из своей программы и передаете ей имя исполняемого файла. Затем закройте свою программу. Программа перезапуска может подождать некоторое время или до тех пор, пока исполняемый файл не будет прочитан для записи, что, по-видимому, означает, что он не работает, тогда он может выполнить его и закрыть сам.
Я ожидаю, что есть лучший способ сделать это, может быть, кто-то может предоставить лучшее решение, но эта функция, похоже, говорит мне, выполняется ли исполняемый файл:
function CanReadWriteFile(const f: TFileName): boolean;
var
i: integer;
begin
Result := false;
i := FileOpen(f, fmOpenReadWrite);
if i >= 0 then begin
Result := true;
FileClose(i);
end;
end;
Источник: progi.pro