Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизКак заставить приложение закрыть себя и сразу открыть снова? Найти похожие ветки
← →
Eugem © (2006-10-06 15:51) [0]Как заставить приложение закрыть себя и сразу открыть снова? Прошу подсказать. Ничего не получается :-(
← →
Сергей М. © (2006-10-06 15:52) [1]Никак.
← →
Ким (2006-10-06 15:57) [2]Примерно так же как умереть и сразу воскреснуть
← →
clickmaker © (2006-10-06 16:02) [3]только через другое приложение
← →
Loginov Dmitry © (2006-10-06 16:04) [4]Типа этого:
procedure TForm1.Button1Click();
begin
Close;
WinExec("Project1.exe", SW_SHOWNORMAL)
end;
← →
Сергей М. © (2006-10-06 16:08) [5]
> Loginov Dmitry © (06.10.06 16:04) [4]
Твое "Типа этого" не соответствует условиям задачи.
← →
Palladin © (2006-10-06 16:08) [6]Вопрос только зачем? С утечкой памяти борьба? :)
← →
from kz (2006-10-06 17:06) [7]Думаю то, что Eugem - это и имел введу.
> Close;
> WinExec("Project1.exe", SW_SHOWNORMAL)
← →
Eugem © (2006-10-06 19:45) [8]
> Вопрос только зачем? С утечкой памяти борьба? :)
Нет, просто требуется перезапуск программы.
← →
Zeqfreed © (2006-10-06 19:58) [9]Добавляй айтем в системный шедулер.
← →
имя (2006-10-15 21:30) [10]Удалено модератором
← →
@!!ex © (2006-10-15 21:41) [11]
> Eugem © (06.10.06 15:51)
Если строго по условию задачи, то сторонний агент.
Который ловит, что процесс завершился и запускает его заново.
Так делают на критичных серверах, чтобы если сервер вдруг по каким то причинам вывалился или завис, то это не приводило к краху всей системы, а он просто перезапускался.
Если же нужно просто перезапустить, то решение уже дано.
Только хочу немножко поправить тот конкретный код, что тут дан
, на более правильный, который будет работать с любым приложением.
procedure TForm1.RestartSystem;
begin
Close;
WinExec(PChar(ParamStr(0)), SW_SHOWNORMAL);
end;
← →
Ketmar © (2006-10-15 21:43) [12]>[11] @!!ex(c) 15-Oct-2006, 21:41
>, на более правильный, который будет работать с любым
>приложением.
вставили флоп. запустили. вынули флоп. работает?
%-)
← →
@!!ex © (2006-10-15 21:50) [13]
> Ketmar © (15.10.06 21:43) [12]
Это не интересно, поскольку мы нарушаем целостность софта, а вэтом случае уже ничто работать не будет. :))
← →
@!!ex © (2006-10-15 21:51) [14]Кстати, тут тоже можно подумать.
Делать копию себя на винт и оттедова уже запускать в случае, если оригинал приложения не доступен....
Или еще как нить извратнуться....
← →
Ketmar © (2006-10-15 21:52) [15]можно. я просто указал на некорректное использование квантора всеобщности. %-)
← →
C@N © (2006-10-16 01:26) [16]нафиг!!! прогружайся в onformcreate... а как надо вызывай эту процедурину)))))
← →
Barloggg (2006-10-16 16:02) [17]а может быть так?
запускаем вторую копию, потом удаляем себя.
procedure TForm1.RestartSystem;
begin
WinExec(PChar(ParamStr(0)), SW_SHOWNORMAL);
Close;
end;
если нет совместно открытых файлов сложностей не будет.
← →
Ketmar © (2006-10-16 17:48) [18]в принципе, можно и fork() реализовать, если уж такая пьянка пошла. %-)
← →
Delpher © (2006-10-16 18:38) [19]
procedure TForm1.RestartSystem;
begin
Close;
WinExec(PChar(ParamStr(0)), SW_SHOWNORMAL);
end;
А разве всё что находится ЗА Close; выполняется=)?
И ещё: а что если в конец exe добавить запуск... Я с асм не знаю, но наверно можно что-то подобное организовать(вирусы же запускаются с конца=) ) Только там условие придется добавить...
← →
Ketmar © (2006-10-16 18:41) [20]>[19] Delpher(c) 16-Oct-2006, 18:38
>А разве всё что находится ЗА Close; выполняется=)?
ещё как.
>И ещё: а что если в конец exe добавить запуск... Я с асм
>не знаю, но наверно можно что-то подобное организовать(
>вирусы же запускаются с конца=) ) Только там условие
>придется добавить...
не надо бредить, ага? что такое "конец .exe"? где это?
← →
Delpher © (2006-10-16 18:48) [21]Ну я условно сказал=) в конец файла с программкой. Туда ещё вирусы записывют и они выполняются. Но здесь точно туева куча гемороя будет:)
← →
Delpher © (2006-10-16 18:52) [22]Вот ещё идея-помойму здесь такой не было.
Пишется дополнительная программка(pr2.exe), которая через секунду после запуска сделаетWinExec("Project1.exe", SW_SHOWNORMAL)
и закроется.
А в основной программе где надо перезапустить напишем:
WinExec("pr2.exe", SW_SHOWNORMAL)
close;
Так избежим конфликтов в доступе:)
← →
@!!ex © (2006-10-16 18:56) [23]
> Delpher © (16.10.06 18:48) [21]
Не надо касаться вещей о которых мало знаете. ;)
> Delpher © (16.10.06 18:52) [22]
Вроде я про агента писал. Нет? :))
← →
Delpher © (2006-10-16 19:05) [24]Я это видел, просто подумал, что агент это вечно-работающий процесс. в принципе у вас так и есть-как он поймает закрытие будучи не запущенным?
← →
@!!ex © (2006-10-16 19:33) [25]
> Delpher © (16.10.06 19:05) [24]
Фича агента в том, что ты не запускаеш основную программу вообще.
Ты запускаеш агента, а он уже смотрит, если программа не запущена, значит нужно ее запустить.
А что будет в вашем случае, если в момент:
> WinExec("pr2.exe", SW_SHOWNORMAL)
программа выполнится и зависинит. Например у нее дофига ресурсов в памяти и она их выгружает, и будет выгружаться более чем 1 секунду?
Аксес виолейшн.
← →
@!!ex © (2006-10-16 19:34) [26]Тьфу. Долбанный Ctrl+Enter....
Я не дописал.
Аксес Виолейшн не будет, но потенциально может быть.
В случае же с агентом - эта возможность исключается.
← →
Delpher © (2006-10-16 20:49) [27]Просто автор топика не намерен следить за "независанием" программы=) А лишний процесс в памяти не очень то нужен....
В этой программке можно забахать не одну секунду, а проверяя доступность пытаться запустить-не доступен-подождем секундочку и попробуем ещё раз, опять не доступен повторим и т.д. доступен-вырубаем цикл и запускаем программку снова(вместо доступности можно проверять наличие процесса ПРОГРАММЫ в памяти). Кстати название процесса основной программы(или хэндл) и путь к ней можно передавать с параметрами=> универсальный загрузчик=)
← →
ККВ (2006-10-17 13:14) [28]procedure AppRestart;
begin
AppExec(ParamStr(0), "", SW_SHOW);
TerminateProcess(GetCurrentProcess, 0);
end;
← →
ККВ (2006-10-17 13:19) [29]function AppExec(const CmdLine, CmdParams: String; const CmdShow: Integer): Boolean;
begin
result:= (ShellExecute(GetCurrentProcess,
"open",
PChar(CmdLine),
PChar(CmdParams),
"",
CmdShow)>32);
end;
← →
Sam Stone © (2006-10-17 14:25) [30]
> программа выполнится и зависинит. Например у нее дофига
> ресурсов в памяти и она их выгружает, и будет выгружаться
> более чем 1 секунду?
создаем мьютекс/что-то еще, запускаем paramstr(0), закрываемся.
В OnClose высвобождаем ресурсы, отъеденные под что-то (массивы, списки etc), убиваем мьютекс/что-то еще.
В OnCreate чекаем наличие мьютекса/чего-то еще и не грузимся дальше, пока он не исчезнет, либо просто смотрим список процессов и пока в нем есть 2 ParamStr(0) - не даем дальше грузиться второй копии
← →
@!!ex © (2006-10-17 16:36) [31]
> ККВ (17.10.06 13:14) [28]
Было уже. Не оригианально.
> Sam Stone © (17.10.06 14:25) [30]
Какие преимущества перед агентом? :))
← →
Sam Stone © (2006-10-17 17:11) [32]
> @!!ex © (17.10.06 16:36) [31]
не надо лишнюю софтину писать и дебажить :)
← →
naxellar (2006-10-19 02:41) [33]Надо батник написать, то бишь файл с расширением .bat.
Прога формирует батник, запускает его, а сама закрывается.
А тот в свою очередь запускает прогу, если надо, мона и задержку в нем прописать.
← →
Palladin © (2006-10-19 08:07) [34]
> мона и задержку в нем прописать.
на 5 лет, что бы точно быть уверенным
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.049 c