Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Вниз

Как проверить при запуске программы, есть ли уже запущенная копия   Найти похожие ветки 

 
dmitry_12_08_74   (2008-04-01 14:21) [0]

Как проверить при запуске программы, есть ли уже запущенная копия?


 
tesseract ©   (2008-04-01 14:28) [1]

См CreateMutex - чаще всего используеться.


 
Сергей М. ©   (2008-04-01 14:29) [2]

см. CreateFileMapping


 
DrPass ©   (2008-04-01 15:03) [3]

см. FindWindow


 
Ega23 ©   (2008-04-01 15:16) [4]

Вопрос не имеет смысла. Если программа уже запущена, то запускаемая программа является копией первой, а не наоборот.  :)


 
Leonid Troyanovsky ©   (2008-04-01 15:18) [5]


> DrPass ©   (01.04.08 15:03) [3]

> см. FindWindow

Тогда уж EnumWindows.

--
Regards, LVT.


 
Семеныч   (2008-04-01 15:20) [6]

> DrPass ©   (01.04.08 15:03) [3]

Если перед созданием окна программа производит какие-то относительно длительные действия (что вовсе не редкость - например, программа коннектится к БД и считывает оттуда данные для своей инициализации), то этот способ запросто может и не сработать.


 
Andy BitOff ©   (2008-04-01 15:49) [7]

> Семеныч   (01.04.08 15:20) [6]

Обычно в таких случаях есть сплэш.


 
Семеныч   (2008-04-01 15:54) [8]

> Andy BitOff ©   (01.04.08 15:49) [7]

Вовсе не факт. "Длительно" - это может быть 1 секунда. Для компьютера это уже длительно, для человека - нет.


 
Andy BitOff ©   (2008-04-01 16:01) [9]

> Семеныч   (01.04.08 15:54) [8]

Ну за секунду - да. За секунду не всякая форма может и создасться, даже если в нет обработки create, paint и etc. Достаточно кучи навороченных компонентов. В таком случае мутексы предпочтительнее, имхо.


 
Kolan ©   (2008-04-01 16:21) [10]

> См CreateMutex — чаще всего используеться.

+1


 
Семеныч   (2008-04-01 16:25) [11]

> Andy BitOff ©   (01.04.08 16:01) [9]
> В таком случае мутексы предпочтительнее, имхо.

Угу. О чем и речь. Вообще, предпочтителен такой алгоритм, в котором создание объекта, по которому определяется дубль (будь то мьютекс, MMF или что угодно еще) никак не связано с остальной логикой программы и поэтому может быть произведено сразу же после ее старта.

А создание окна (когда его создавать, каким его создавать, да и создавать ли его вообще) с логикой работы программы все же связано. Поэтому может возникнуть ситуация когда окно нужно создавать не сразу, или оно может создаваться медленно, или может не создаваться вообще. В этом и недостаток.


 
Johnmen ©   (2008-04-01 21:12) [12]


> tesseract ©   (01.04.08 14:28) [1]
> См CreateMutex - чаще всего используеться.

Кем используется чаще всего?


 
ZoldBerger   (2008-04-04 13:43) [13]

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;


 
Loginov Dmitry ©   (2008-04-04 23:14) [14]

вариант покороче:
 CreateMutex(nil, False, "D9BB129F-0918-4C4B-B70D-5BCDFF4CD3E7");
 if GetLastError = ERROR_ALREADY_EXISTS then Exit;


 
Overdrive   (2008-05-23 01:21) [15]

Вариант еще короче. В dpr вставь

var
 hMutex : THandle;
begin
 hMutex := CreateMutex( nil, true , "Clock" );
 if GetLastError = ERROR_ALREADY_EXISTS then
 begin
   CloseHandle( hMutex );
   Halt;
 end;
...


 
Германн ©   (2008-05-23 01:43) [16]


> Overdrive   (23.05.08 01:21) [15]
>
> Вариант еще короче.

И чем же он "короче" варианта Loginov Dmitry ©   (04.04.08 23:14) [14]?


 
LightRipple ©   (2008-05-23 02:20) [17]

>  [16] Германн ©   (23.05.08 01:43)
> И чем же он "короче" варианта Loginov Dmitry ©   (04.04.08 23:14) [14]?

Вот все Вам надо разжевывать :)
У Loginov Dmitry имя мьютекса вон какое огроменное, а здесь всего пять букв :)


 
Loginov Dmitry ©   (2008-05-23 07:58) [18]

> Вариант еще короче. В 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]?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.06.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
15-1239884057
Городской Шаман
2009-04-16 16:14
2009.06.21
А вы подаёте Open Source проектам?


15-1239525868
Kerk
2009-04-12 12:44
2009.06.21
С днем космонавтики!


9-1179168683
Pa5ha
2007-05-14 22:51
2009.06.21
Джойстик


2-1241358638
Cobalt
2009-05-03 17:50
2009.06.21
TreeViewItem и Parent


15-1239225085
Stan
2009-04-09 01:11
2009.06.21
вопрос по CloseQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский