![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не запустить вторую копию программы
foreverDelphi © (2007-08-26 03:27:00)запустил программу, создал атом и наслаждаешся результатом, никаких других запусков копий программы одновремено. А вот грабли в том что в случае вылета программы с ошибкой атом не удаляется в Destroy формыи в результате после етого невозможно перезапустить программу.
Leonid Troyanovsky (2007-08-27 13:49:00) [1]
> Anatoly Podgoretsky © (27.08.07 13:43) [13]
> А зачем, при наличии надежных методов искать сомнительные.
Сначала в сомнительных нужно усомниться :)
--
Regards, LVT.
Anatoly Podgoretsky (2007-08-27 13:43:00) [2]> Leonid Troyanovsky (27.08.2007 13:07:11) [11]
А зачем, при наличии надежных методов искать сомнительные.
iXT (2007-08-27 13:30:00) [3]> [10] Leonid Troyanovsky © (27.08.07 13:01)
Упс, упустил :)
Leonid Troyanovsky (2007-08-27 13:07:00) [4]
> orinoko (27.08.07 12:10) [8]
> OnCreate главной формы вставить:
Не все так просто, к сожалению.
Скажем, не FindWindow, а EnumWindows,
и, видимо, не OnCreate, а кроме того,
понадобится синхронизация и т.п.
--
Regards, LVT.
Leonid Troyanovsky (2007-08-27 13:01:00) [5]
> iXT © (27.08.07 12:57) [9]
> А кто и где говорил про форму? Или телепатор сказал? :)
foreverDelphi © (26.08.07 03:27) :)
--
Regards, LVT.
iXT (2007-08-27 12:57:00) [6]> [8] orinoko (27.08.07 12:10)
А кто и где говорил про форму? Или телепатор сказал? :)
orinoko (2007-08-27 12:10:00) [7]На мой взгляд, это вполне устроит вопрошающего. В событие OnCreate главной формы вставить:
procedure TMainForm.FormCreate(Sender: TObject);
var S: string;
begin
//Проверяем, не запущено ли уже приложение
//Запоминаем заголовок
s:=Application.Title;
//Меняем на что-то другое, чтоб FindWindow его не нашла
Application.Title:='runonce'+s;
//Ищем окно с заголовком приложения
PrevInstWind:=FindWindow(nil,pchar(s));
if PrevInstWind<>0 then
//Если нашли, то ...
begin
//Запрещаем показ главной формы
Application.ShowMainForm := false;
//Завершаем текущее приложение
Application.Terminate;
//Активизируем предыдущую копию
if IsIconic(PrevInstWind)
then
ShowWindow(PrevInstWind,SW_RESTORE)
else
SetForegroundWindow(PrevInstWind);
//Завершаем процедуру
exit;
end;
//Восстанавливаем заголовок
Application.Title:=s;
//Дальше пишется, если ещё чёта нужно
...
end;
brother (2007-08-27 05:11:00) [8]
> Правильно думал. Они ничего не запрещают, и не разрешают.
> И вообще никакого отношения к запуску программ не имеют.
>
это раньше, а теперь же понедельник, по понедельникам можно)
DrPass (2007-08-26 15:02:00) [9]
> чего-то думал раньше что мутексы не запрещают запуск той
> же программы, но с другого каталога
Правильно думал. Они ничего не запрещают, и не разрешают. И вообще никакого отношения к запуску программ не имеют.
foreverDelphi (2007-08-26 14:59:00) [10]
> самый короткий способ для реализации задуманного:
а я чего-то думал раньше что мутексы не запрещают запуск той же программы, но с другого каталога, а так спасиба и разобрался и подходит на 100%
Loginov Dmitry (2007-08-26 09:40:00) [11]самый короткий способ для реализации задуманного:
program project1;
begin
CreateMutex(nil, False, 'уникальная строка');
if GetLastError = ERROR_ALREADY_EXISTS then Exit;
..............
end;
Может есть варианты покороче, не знаю :)
Leonid Troyanovsky (2007-08-26 07:38:00) [12]
> foreverDelphi © (26.08.07 03:43) [2]
> будет выполнен, и еще, а если просто завершить процесс через
> менеджер процессов
Если процесс будет терминирован, то атом так и останется
до конца сессии.
Т.е., это плохой способ, лучше создавать именованные
объекты ядра, например, CreateFileMapping.
Есть такая конференция "Начинающим", welcome.
--
Regards, LVT.
foreverDelphi (2007-08-26 03:43:00) [13]
> Значит то, что атом нужно удалять не только "в Destroy формы",
> но и в других местах. Особо следует обратить внимание на
> "обратку ошибок". :)
я как новичок, еще задам вопрос, а обрабчик ошибок всегда будет выполнен, и еще, а если просто завершить процесс через менеджер процессов
Германн (2007-08-26 03:35:00) [14]
> foreverDelphi © (26.08.07 03:27)
>
> запустил программу, создал атом и наслаждаешся результатом,
> никаких других запусков копий программы одновремено. А
> вот грабли в том что в случае вылета программы с ошибкой
> атом не удаляется в Destroy формы и в результате после етого
> невозможно перезапустить программу.
>
А что это значит?
Значит то, что атом нужно удалять не только "в Destroy формы", но и в других местах. Особо следует обратить внимание на "обратку ошибок". :)
P.S. На обработку ошибок стоит обращать внимание всегда!