|
Вопрос # 3 162/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как реализовать проверку, запущена ли уже программа(работает в данный момент), которую пытается запустить пользователь?
Сейчас пишу программу которая должна быть запущенна на компьютере в единственном экземпляре и не знаю как это реализовать.
(если это имеет значение в программе используется несколько форм и компонент CoolTrayIcon)
Заранее огромное спасибо за ответ!
 |
Вопрос задал: Сергей FausT Елфимов (статус: Посетитель)
Вопрос отправлен: 8 сентября 2009, 23:14
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, Сергей FausT Елфимов!
Один из вариантов - при запуске программы создавать именованный объект ядра (например, мьютекс) и проверять его существование. Если он уже существует, то запускается копия программы.
 |
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 8 сентября 2009, 23:24
Оценка за ответ: 2
Комментарий к оценке: Данный метод действительно работает спасибо.
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Сергей FausT Елфимов!
Простой и красивый способ - через именнованный семафор. Например в FormCreate для главной формы добавляем такой код
procedure TForm1.FormCreate(Sender: TObject);
var
Sem: THandle;
begin
Sem := CreateSemaphore(nil, 0, 1, 'PROGRAM_NAME');
if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
begin
CloseHandle(Sem);
ShowMessage('This program is already running.');
Halt;
end;
end;
вместо 'PROGRAM_NAME' лучше вставить свою строку, а то может быть, что две разные программы не смогут быть запущенны вместо. Что бы получить достаточно уникальную строку, в редакторе делфи жмем Ctrl+Shift+G и удаляем оттудова кавычки. получиться что то вида '{D871DA61-4B10-4E8C-BAA8-6848A178BBF9}'
а можно через мютекс.
var
mHandle: THandle; // Mutexhandle
initialization
mHandle := CreateMutex(nil, True, 'XYZ');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
ShowMessage('Program is already running!');
halt;
end;
finalization
if mHandle <> 0 then CloseHandle(mHandle)
end.
этот код достаточно дописать в конце юнита главной формы (end с точкой там уже будет).
Дальнейшую модификацию кода надо делать по собственному вкусу.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 сентября 2009, 23:28
Оценка за ответ: 5
Комментарий к оценке: Огромное вам спасибо за ответ.
Всё прекрасно работает!
|
Мини-форум вопроса
Всего сообщений: 25; последнее сообщение — 10 сентября 2009, 21:12; участников в обсуждении: 5.
Страницы: [1] [2] [Следующая »]
|
Сергей FausT Елфимов (статус: Посетитель), 9 сентября 2009, 00:00 [#1]:
Простой и красивый способ - через именнованный семафор, к сожалению привел к ошибке приложения, но через мютекс всё заработало великолепно.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 00:15 [#2]:
На самом деле эти два способоа отличаются только местом вызова кода. Возможно в вашем приложении компоненты в своих конструкторах делают что то "тяжелое". А может... да много чего ещё может. Без анализа кода и как был вставлен код ни о чем нельзя говорить.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Сергей FausT Елфимов (статус: Посетитель), 9 сентября 2009, 00:33 [#3]:
может, может, на самом деле, эта программа мой первый проект в среде Delphi. И по стечению обстоятельств проект довольно большой для первого. Так что код оптимизированным назвать просто невозможно. За отсутствие познаний приходится расплачиваться титаническим трудом, но, на то она и бета версия.
В будущем планирую полностью переписать, а пока даже код показывать страшно.
|
|
Сергей FausT Елфимов (статус: Посетитель), 9 сентября 2009, 00:40 [#4]:
На данном этапе могу лишь осмелиться выложить EXE файл и выслушать критику.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 09:54 [#5]:
"Оценка за ответ: 2"
"Комментарий: Данный метод действительно работает спасибо."
Похоже автора вопроса в детстве много и часто били.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 10:58 [#6]:
ну раз первый и "довольно большой"... Если там несколько форм (несколько - это меньше десяти, я думаю), то это не большой проект, а маленький. Большой проект - это 50-100 форм, по тысяч 5-10 строк в каждом юните (хотя бы).
По exe диагностику ставить не буду, и врядли здесь это кто то будет делать, только исходный код.
to Паровоз.
Я полностью согласен с вопрошающим. Ваш ответ годиться максимум на сообщение для минифорума.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 11:48 [#7]:
То Вадим:
Возможны только два варианта:
1) Либо Вы ставите 2, а в комментарии пишите, что ответ никуда не годится
2) Если Вы пишите "Данный метод действительно работает спасибо", то это не соответствует оценке 2 (можно вообще ничего не ставить).
А если Вы считаете, что оценка 2 соответствует данному коментарию то, видимо, у Вас что-то не в порядке с головой.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 12:09 [#8]:
to Паровоз.
Вы наверно не чувствуете разницу между двумя балами и оценкой в два бала. Да, в школе, для тех, кто учился по пятибалльной системе, 2 - это плохая оценка, которая показывает незнание предмета.
Но если рассматривать два как балы (как теперь в украинских школах сделали, правда у нас 12бальная система), то это просто как "чуточку полезный".
Цитата:
видимо, у Вас что-то не в порядке с головой.
Если Ваш возраст указан правильно в анкете, то это выражение выглядит очень грубо. Будьте аккуратны и вежливы.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 16:19 [#9]:
Цитата:
это выражение выглядит очень грубо
Если это Вас задело, приношу свои извинения.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 16:26 [#10]:
Цитата:
Ваш ответ годиться максимум на сообщение для минифорума
Тем не менее считаю это заявление просто нелепым. Весь код состоит из двух строчек и о том, что там должно было быть написано сказано в моем ответе.
P.S. А что Вы скажите по поводу присуждения приза за ответ на вопрос 2938. В этот ответе также почти ничего не сказано. И результаты голосования меня удивили. Присуждение приза за такой ответ мне кажется таким же нелепым, как и приводимая здесь цитата.
|
|
Ерёмин А.А. (статус: *Администратор), 9 сентября 2009, 16:42 [#11]:
Напомню, что кубки вручаются исключительно по результатам голосования. Вы и сами можете голосовать - справа от вопроса и от ответов есть "звёздочки". Уже неоднократно побеждали ответы, которые не очень подходят под звание лучших. Тем не менее, делать исключения и на этот выбор? Не лучший вариант. Если выбирать будет администратор, тоже много камней полетят.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 16:42 [#12]:
не все люди знают, что такое мютекс. А вопрос 2938... тема насколько проработаная, что достаточно в гугл ввести имена функций, и сразу можно наткнуться на код. К тому же, когда дается ответ, надо следить за тем, кому он дается. Для одного человека достаточно написать название одной функции и всё, дальше он сам справиться. Для другого даже если дать весь код, приложить работающий проект, будет недостаточно.
Как определить? это просто девятое чувство... (седьмое, восьмое уже занято ).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 16:47 [#13]:
Цитата:
Как определить? это просто девятое чувство
Сомневаюсь. Просто дело случая.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 16:51 [#14]:
Цитата:
вопрос 2938... тема насколько проработаная, что достаточно в гугл ввести имена функций, и сразу можно наткнуться на код
Набрал в гугле текст
"реализовать проверку, запущена ли уже программа"
Сразу же в 4-й ссылке куча способов для Delphi, в том числе и с мьютексом.
|
|
Вадим К (статус: Академик), 9 сентября 2009, 17:05 [#15]:
Не все люди умеют гуглить
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 17:13 [#16]:
"Не все люди умеют гуглить"
Ну, так "гуглить" - это Ваш совет.
|
|
Amidamaru (статус: 4-ый класс), 9 сентября 2009, 17:15 [#17]:
С семафором мне кажется тут не очень хороший вариант.
1) делать проверку (как и с мьютексом) нужно в initialization
2) семафор всётаки создан немного для другого способа синхронизации
|
|
Вадим К (статус: Академик), 9 сентября 2009, 17:25 [#18]:
to Паровоз
К каждому человеку человеку свой подход. кого то надо подтолкнуть к тому, что бы погуглил, дав нужное слово, кому то надо растолковать. Вы же пытаетесь частные варианты привести к общим. Я за индивидуальный подход к каждому.
to Amidamaru
Я сделал два таких варианта, хотя намекнул что их можно в 4 размножить. В данном случае оба варианта хороши. Но с семафором можно решить задачу "разрешить запуск только пяти приложений", с мютексом - можно, но гораздо сложнее.
а вот где делать проверку - это дело чисто субъективное. Я бы вообще её вставил в файл проекта. Я просто решил не усложнять решение.
Но может ведь задача быть и так поставлена. "разрешить запуск любого кол-ва программ, но специальную функцию (к примеру синхронизацию с базой) только с одной копии. но если на одной копии синхронизация завершилась, то дать возможность и с другой."
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Паровоз (статус: 10-ый класс), 9 сентября 2009, 17:46 [#19]:
To Вадим:
Нет у Вас никакого индивидуального подхода. Вы говорите неправду - свой ответ Вы написали сразу же после моего (4 минуты спустя).
|
|
Вадим К (статус: Академик), 9 сентября 2009, 17:59 [#20]:
Я увидел Ваш ответ только после того, как написал свой. я потратил на него точно больше 4 минут, потому что я пробовал в код в делфи. Не думали об этом?
Галочка "подтверждения прочтения" - вселенское зло.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|