Текущий архив: 2007.09.02;
Скачать: CL | DM;
Вниз
Проверка не запущена ли уже эта программа Найти похожие ветки
← →
Надежда (2007-08-07 15:12) [0]Как можно в своей программе проверить не запущена ли уже эта программа на компьютере ? Пожалуйста, подскажите!
← →
Сергей М. © (2007-08-07 15:26) [1]Что такое "эта программа" ?
← →
JanMihail © (2007-08-07 15:26) [2]Ищешь окно по классу и по заголовку окна. Так как это твоя программа, ты их знаешь. Если такое есть, значит запущена.
if FindWindow(<класс окна>, <заголовок окна>) <> 0 then
ShowMessage("Прога запущена")
else
ShowMessage("Прога не запущена");
Ну это как простой вариант. Может быть и другая программа с таким классом и заголовком. Поэтому желательно какой-либо отличительный признак. Например создать класс TMyProgramAndTolkoMyProgram наследником класса TEdit. Затем поместить его на форму. И сделать проверку на еще одно условие.if FindWindowEx(<хэндл окна>, 0, "TMyProgramAndTolkoMyProgram", nil) <> 0 then
ShowMessage("Прога точно запущена")
else
ShowMessage("Прога точно не запущена");
← →
Сергей М. © (2007-08-07 15:27) [3]
> JanMihail © (07.08.07 15:26) [2]
>
> Ищешь окно по классу и по заголовку окна
Какое нафих окно, если программа как таковая вовсе не обязана создавать какие бы то ни было окна ?
← →
JanMihail © (2007-08-07 15:32) [4]
> Какое нафих окно, если программа как таковая вовсе не обязана
> создавать какие бы то ни было окна ?
Но я так предполагаю, что автор новичок. И он не знает еще, что прога бывает без окон. Наверняка он запустил Delphi и появилась форма. Он и думает, что это и есть прога
← →
Надежда (2007-08-07 15:37) [5]Окон в программе действительно нет. Есть моя программка, перекачивающая данные из одного хранилища в другое. Работает нормально. Но её не видно и иногда даже сама пытаюсь запустить её второй раз. А вот этого уже нельзя делать. Вот и требуется проверять : а не запустила ли я её уже. А с других рабочих мест она запускается по расписанию. Так что надеяться только на "человеческий фактор" не приходится. Посоветуйте, пожалуйста, как быть ?
← →
Сергей М. © (2007-08-07 15:39) [6]
> Надежда (07.08.07 15:37) [5]
см., к примеру, GlobalAddAtom, GlobalFindAtom, GlobalDeleteAtom
← →
l_v (2007-08-07 16:45) [7]можно к примеру через реестр:
при запуске проверять значение какого-то созданного тобой параметра в реестре, если 0, то программа единственная и можно дальше работать и потом сразу же пишешь в этот параметр 1, а при завершении работы пишешь в тот параметр 0, если допустим 1, то значит прога запущена и выход.
← →
Virgo_Style © (2007-08-07 16:47) [8]l_v (07.08.07 16:45) [7]
Если же программа вдруг упала - не вопрос, лезешь в реестр и ручками правишь значение
← →
Сергей М. © (2007-08-07 16:49) [9][7], [8]
О боже)
← →
l_v (2007-08-07 16:52) [10]
> Virgo_Style © (07.08.07 16:47) [8]
ну это же как вариант, у вас постоянно все падает?
← →
Virgo_Style © (2007-08-07 16:54) [11]Сергей М. © (07.08.07 16:49) [9]
Кто-то тут жаловался, что люди не понимают, где стеб, а где нет... не напомните, кто? %-))
← →
l_v (2007-08-07 16:54) [12]
> Сергей М. © (07.08.07 16:49) [9]
спасибо за комплимент! первый раз меня называют богом... :)
← →
Virgo_Style © (2007-08-07 16:56) [13]l_v (07.08.07 16:52) [10]
ну это же как вариант
По моему скромному мнению, плохой вариант еще можно предложить до хорошего, но никак не после)
P.S. На RSDN была целая статья на эту тему. Даже, кажется, с примером.
← →
Сергей М. © (2007-08-07 16:58) [14]
> Virgo_Style © (07.08.07 16:54) [11]
Это жестокий стёб)
Можно ли он в дан.случае ? Сомневаюсь)
← →
MetalFan © (2007-08-07 17:04) [15]mutex самое отличное решение имхо
← →
ASoft (2007-08-07 17:42) [16]простое решение, создать файл, к примеру в \temp, с флагом на удаление после завершения приложения. При старте проверять его наличие..
← →
Leonid Troyanovsky © (2007-08-07 17:51) [17]
> Сергей М. © (07.08.07 15:39) [6]
> см., к примеру, GlobalAddAtom, GlobalFindAtom, GlobalDeleteAtom
Даже смотреть не стоит.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-08-07 18:01) [18]
> Надежда (07.08.07 15:37) [5]
> Окон в программе действительно нет. Есть моя программка,
> перекачивающая данные из одного хранилища в другое. Работает
> нормально.
Если это не консольное приложение, то оно не получит уведомления,
например, о завершении сессии.
А если консольное, то его, все же, можно увидеть.
Проще всего, для начала, сделать ему окно (или форму)
хотя бы и невидимые.
--
Regards, LVT.
← →
Virgo_Style © (2007-08-07 18:31) [19]ASoft (07.08.07 17:42) [16]
Действительно, гораздо удобнее, в случае падения программы ручками надо не в реестр лезть, а всего лишь файл удалить.
p.s. Это - стеб.
p.p.s. http://rsdn.ru/article/baseserv/avins.xml - а это статья.
← →
Virgo_Style © (2007-08-07 18:34) [20]Virgo_Style © (07.08.07 18:31) [19]
Действительно, гораздо удобнее, в случае падения программы ручками надо не в реестр лезть, а всего лишь файл удалить.
Не разглядел "флаг на удаление после завершения", виноват... но все равно метод несколько "через Париж в Мытищи", imho.
← →
ASoft (2007-08-07 18:46) [21]грубо говоря, я имел в виду что-то на подобие
if FileExists(FileName) then
begin
if not DeleteFile(FileName) then
begin
Application.MessageBox("too copy" ,"Run My prog",MB_ICONWARNING or MB_SYSTEMMODAL);
// Application.Terminate;
end;
end;
............
CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0)
....
← →
Leonid Troyanovsky © (2007-08-07 19:17) [22]
> Virgo_Style © (07.08.07 18:34) [20]
> .. но все равно метод несколько "через Париж в Мытищи",
Несколько это сколь?
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2007-08-07 19:40) [23]Мужики да вам witness сервер просто крайне необходим.
← →
MetalFan © (2007-08-07 20:15) [24]повторюсь: используйте mutex"ы. они вроде уничтожаются при завершении создавшего их процесса...
← →
Virgo_Style © (2007-08-07 21:14) [25]Leonid Troyanovsky © (07.08.07 19:17) [22]
Несколько это сколь?
- Петька, приборы!
- Двадцать!
- Что двадцать?
- А что приборы??
Работа с файлами для этой задачи imho ни к чему. И еще, я подозреваю, что у этого файла все же есть шанс выжить, например при выключении reset"ом, сбое питания и так далее. Возможно я и ошибаюсь.
← →
trubin © (2007-08-07 21:17) [26]
> повторюсь: используйте mutex"ы. они вроде уничтожаются при
> завершении создавшего их процесса...
Или другие именованые объекты ядра: события, проекции файлов ...
← →
ASoft (2007-08-08 04:51) [27]
> Virgo_Style © (07.08.07 21:14) [25]
>И еще, я подозреваю, что у этого файла все же есть шанс выжить, например при выключении reset"ом, сбое питания и так далее...
ага, не исключено:) Для этого я и установил проверку в начале своего примераif FileExists(FileName) then
begin
if not DeleteFile(FileName) then
begin
...
Если есть такой файл и его можно удалить, то можно предположить, что твое приложение было завершено аварийно
Конечно, такой способ не панацея, только как альтернатива и имхо..:-)
← →
Надежда (2007-08-13 13:06) [28]Всем СПАСИБО. Особенно Вам, Сергей М. ! Всё получилось.
← →
Leonid Troyanovsky © (2007-08-13 13:46) [29]
> Надежда (13.08.07 13:06) [28]
> Всё получилось.
А это только кажется.
Запусти приложение, затем сними диспетчером.
Попытайся запустить снова. Сюрприз?
Кроме того, не стоит пренебрегать и окончанием сессии.
Т.е., попытайся при работающем приложении сделать логоф.
IMHO, проще сделать Application.ShowMainForm := False,
и работать с ним, как с обычным оконным приложением.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2007.09.02;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.038 c