![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проверить при запуске программы, есть ли уже запущенная копия [D7, WinXP]
dmitry_12_08_74 © (2008-04-01 14:21:00)Как проверить при запуске программы, есть ли уже запущенная копия?
Loginov Dmitry (2008-05-23 07:58:00) [1]> Вариант еще короче. В dpr вставь
>
> var
> hMutex : THandle;
> begin
> hMutex := CreateMutex( nil, true , 'Clock' );
> if GetLastError = ERROR_ALREADY_EXISTS then
> begin
> CloseHandle( hMutex );
> Halt;
> end;
> ...
1) корректрее вставлять не в dpr, а в секцию initialization первого модуля в списке модулей проекта. Иначе заставишь отработать весь код, заключенный в initialization всех модулей проекта
2) Ты должен гарантировать уникальность имени объекта синхронизации. Причем в каждом проекте требуется свое уникальное имя.
3) Зачем ты делаешь за операционную систему лишнюю работу? Виндовс гарантирует, что по окончанию работы проложения будут удалены все объекты синхронизации.
4) Чем же твой вариант короче? По каким критериям была оценена его краткость? Если относительно [13], то почему было проигнорировано [14]?
LightRipple (2008-05-23 02:20:00) [2]> [16] Германн © (23.05.08 01:43)
> И чем же он "короче" варианта Loginov Dmitry © (04.04.08 23:14) [14]?
Вот все Вам надо разжевывать :)
У Loginov Dmitry имя мьютекса вон какое огроменное, а здесь всего пять букв :)
Германн (2008-05-23 01:43:00) [3]
> Overdrive (23.05.08 01:21) [15]
>
> Вариант еще короче.
И чем же он "короче" варианта Loginov Dmitry © (04.04.08 23:14) [14]?
Overdrive (2008-05-23 01:21:00) [4]Вариант еще короче. В dpr вставь
var
hMutex : THandle;
begin
hMutex := CreateMutex( nil, true , 'Clock' );
if GetLastError = ERROR_ALREADY_EXISTS then
begin
CloseHandle( hMutex );
Halt;
end;
...
Loginov Dmitry (2008-04-04 23:14:00) [5]вариант покороче:
CreateMutex(nil, False, 'D9BB129F-0918-4C4B-B70D-5BCDFF4CD3E7');
if GetLastError = ERROR_ALREADY_EXISTS then Exit;
ZoldBerger (2008-04-04 13:43:00) [6]
unit uMutexOneCopy;
interface
function Init_Mutex(mid: string): boolean;
implementation
uses Windows;
var
mut: thandle;
function mut_id(s: string): string;
var
f: integer;
begin
result := s;
for f := 1 to length(s) do
if result[f] = '\' then
result[f] := '_';
end;
function Init_Mutex(mid: string): boolean;
begin
Mut := CreateMutex(nil, false, pchar(mut_id(mid)));
Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
end;
initialization
mut := 0;
finalization
if mut <> 0 then
CloseHandle(mut);
end.
begin
if not init_mutex('ЛЮБОЕ СЛОВО') then
exit;
Application.Initialize;
...
..
Application.Run;
end;
Johnmen (2008-04-01 21:12:00) [7]
> tesseract © (01.04.08 14:28) [1]
> См CreateMutex - чаще всего используеться.
Кем используется чаще всего?
Семеныч (2008-04-01 16:25:00) [8]> Andy BitOff © (01.04.08 16:01) [9]
> В таком случае мутексы предпочтительнее, имхо.
Угу. О чем и речь. Вообще, предпочтителен такой алгоритм, в котором создание объекта, по которому определяется дубль (будь то мьютекс, MMF или что угодно еще) никак не связано с остальной логикой программы и поэтому может быть произведено сразу же после ее старта.
А создание окна (когда его создавать, каким его создавать, да и создавать ли его вообще) с логикой работы программы все же связано. Поэтому может возникнуть ситуация когда окно нужно создавать не сразу, или оно может создаваться медленно, или может не создаваться вообще. В этом и недостаток.
Kolan (2008-04-01 16:21:00) [9]> См CreateMutex чаще всего используеться.
+1
Andy BitOff (2008-04-01 16:01:00) [10]> Семеныч (01.04.08 15:54) [8]
Ну за секунду - да. За секунду не всякая форма может и создасться, даже если в нет обработки create, paint и etc. Достаточно кучи навороченных компонентов. В таком случае мутексы предпочтительнее, имхо.
Семеныч (2008-04-01 15:54:00) [11]> Andy BitOff © (01.04.08 15:49) [7]
Вовсе не факт. "Длительно" - это может быть 1 секунда. Для компьютера это уже длительно, для человека - нет.
Andy BitOff (2008-04-01 15:49:00) [12]> Семеныч (01.04.08 15:20) [6]
Обычно в таких случаях есть сплэш.
Семеныч (2008-04-01 15:20:00) [13]> DrPass © (01.04.08 15:03) [3]
Если перед созданием окна программа производит какие-то относительно длительные действия (что вовсе не редкость - например, программа коннектится к БД и считывает оттуда данные для своей инициализации), то этот способ запросто может и не сработать.
Leonid Troyanovsky (2008-04-01 15:18:00) [14]
> DrPass © (01.04.08 15:03) [3]
> см. FindWindow
Тогда уж EnumWindows.
--
Regards, LVT.
Ega23 (2008-04-01 15:16:00) [15]Вопрос не имеет смысла. Если программа уже запущена, то запускаемая программа является копией первой, а не наоборот. :)
DrPass (2008-04-01 15:03:00) [16]см. FindWindow
Сергей М. (2008-04-01 14:29:00) [17]см. CreateFileMapping
tesseract (2008-04-01 14:28:00) [18]См CreateMutex - чаще всего используеться.