Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 162

Раздел: Delphi » Прочее
/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Подскажите пожалуйста как реализовать проверку, запущена ли уже программа(работает в данный момент), которую пытается запустить пользователь?
Сейчас пишу программу которая должна быть запущенна на компьютере в единственном экземпляре и не знаю как это реализовать.
(если это имеет значение в программе используется несколько форм и компонент CoolTrayIcon)
Заранее огромное спасибо за ответ!

Сергей FausT Елфимов Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей 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 Елфимов

Сергей FausT Елфимов (статус: Посетитель), 9 сентября 2009, 00:00 [#1]:

Простой и красивый способ - через именнованный семафор, к сожалению привел к ошибке приложения, но через мютекс всё заработало великолепно.
Вадим К

Вадим К (статус: Академик), 9 сентября 2009, 00:15 [#2]:

На самом деле эти два способоа отличаются только местом вызова кода. Возможно в вашем приложении компоненты в своих конструкторах делают что то "тяжелое". А может... да много чего ещё может. Без анализа кода и как был вставлен код ни о чем нельзя говорить.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей FausT Елфимов

Сергей FausT Елфимов (статус: Посетитель), 9 сентября 2009, 00:33 [#3]:

может, может, на самом деле, эта программа мой первый проект в среде Delphi. И по стечению обстоятельств проект довольно большой для первого. Так что код оптимизированным назвать просто невозможно. За отсутствие познаний приходится расплачиваться титаническим трудом, но, на то она и бета версия.
В будущем планирую полностью переписать, а пока даже код показывать страшно.
Сергей FausT Елфимов

Сергей 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

Amidamaru (статус: 4-ый класс), 9 сентября 2009, 17:15 [#17]:

С семафором мне кажется тут не очень хороший вариант.
1) делать проверку (как и с мьютексом) нужно в initialization
2) семафор всётаки создан немного для другого способа синхронизации :)
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Вадим К

Вадим К (статус: Академик), 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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.