Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как проверить запущена ли программа?

305
21 марта 2003 года
Kashuk
385 / / 21.02.2003
Мне надо зделать так: если программа запужена, то не запускатся второй раз, как это зделать?
860
22 марта 2003 года
Abell2000
138 / / 15.01.2003
Цитата:
Originally posted by Kashuk
Мне надо зделать так: если программа запужена, то не запускатся второй раз, как это зделать?


Кажись тут это уже раз сто обсуждалось.
Вобщем, можно через FindWindow-самый простой способ, можно через мутексы, семафоры, файлы в памяти. Выбирай на вкус:)

2.0K
23 марта 2003 года
segev
67 / / 19.01.2003
Понимаю, что многих этот вопрос уже достал, но тем не менее.
Kashuk
Не рекомендую использовать FindWindow, хотя многие говорят, что это проще. Эта функция не помогает в одном из распространенных случаев запуска второго экземпляра - лишнего клика мышкой по иконке. В это время окно первого экземпляра возможно еще не создано, поэтому результат FindWindow будет отрицательным и соответственно запустится второй экземпляр.
Более надежным является реализация через мьютекс.
1.6K
23 марта 2003 года
JlamePoK
47 / / 02.02.2003
if (FileExists("c:\\AlreadyRun.tmp")!=1)
{
CreateFile("c:\\AlreadyRun.tmp", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
}
else if (FileExists("c:\\AlreadyRun.tmp")==1)
{
MessageBox(0,"Program already run!\nPlz close the program and try again","",MB_ICONWARNING);
Application->Terminate();
}
самый простой и надежный способ!
-->снкс тому человеку,который его пне дал!
3
23 марта 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by JlamePoK
if (FileExists("c:\\AlreadyRun.tmp")!=1)
{
CreateFile("c:\\AlreadyRun.tmp", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
}
else if (FileExists("c:\\AlreadyRun.tmp")==1)
{
MessageBox(0,"Program already run!\nPlz close the program and try again","",MB_ICONWARNING);
Application->Terminate();
}
самый простой и надежный способ!
-->снкс тому человеку,который его пне дал!



Конечно, "на вкус и цвет товарищей нет", но этот способ ни в какие ворота не лезет. Если в способе с мьютексом есть один нюанс с высвобождением ресурса (мьютекса) при некорректном завершении программы, который лечиться (в крайнем случае) со стороны пользователя с помощью "Reset", то в случае с файлов этих нюансов пруд пруди. Первое что приходит в голову: что делать если программаа завершилась некорректно? Второй раз её, видимо, не запустить даже после перезагрузки. Да и не красиво как-то перед пользователем, открывает он свой диск С:, а там куча левых файлов, пациент в панике... А если диска С: в системе нет?

Я за мьютекс!

305
24 марта 2003 года
Kashuk
385 / / 21.02.2003
Спасибо JlamePoK но этот вариант действительно имеет очень много нюансов!!!, это не подходит, но всёравно спасибо.
2.0K
26 марта 2003 года
segev
67 / / 19.01.2003
Green
Цитата:

Если в способе с мьютексом есть один нюанс с высвобождением ресурса (мьютекса) при некорректном завершении программы, который лечиться (в крайнем случае) со стороны пользователя с помощью "Reset"


Никаких ньюансов с мьютексом нет. При любом завершении программы ОС обязана освободить все ресурсы приложения, в том числе и мьютексы.
Дырявая Win9x может иногда забыть об этом, но ее дни сочтены: все прогрессивное человечество переходит (или давным давно перешло, как я :cool: ) на NT !
P.S. Я тоже за мьютекс.

421
28 марта 2003 года
bercut
124 / / 20.06.2000
// Как проследить чтобы только одна копия приложения работала в данный момент
//---------------------------------------------------------------------------
void __fastcall TForm::FormCreate(TObject *Sender)
{
if (WeAreAlone ("MY_PROGRAMM.EXE"))
{
// Proceed
}
else
{
MessageBox (NULL,"Error","Ошибка: Программа уже загружена!",MB_OK|MB_ICONERROR);
exit(1);
}
}
//---------------------------------------------------------------------------
BOOL TClientForm::WeAreAlone (LPSTR szName)
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
Но проблема опять же кроется в мьютексах, если приложение будет некоректно завершено, то запустить второй раз приложение без перезагрузки компа ты не сможешь.
2.0K
29 марта 2003 года
segev
67 / / 19.01.2003
bercut
Цитата:
Но проблема опять же кроется в мьютексах, если приложение будет некоректно завершено, то запустить второй раз приложение без перезагрузки компа ты не сможешь.


Сколько раз пытался, так и не удалось завершить приложение так некорректно, чтобы пришлось перезагрузаться. Открой секрет.

305
29 марта 2003 года
Kashuk
385 / / 21.02.2003
Цитата:
Originally posted by bercut
// Как проследить чтобы только одна копия приложения работала в данный момент
//---------------------------------------------------------------------------
void __fastcall TForm::FormCreate(TObject *Sender)
{
if (WeAreAlone ("MY_PROGRAMM.EXE"))
{
// Proceed
}
else
{
MessageBox (NULL,"Error","Ошибка: Программа уже загружена!",MB_OK|MB_ICONERROR);
exit(1);
}
}
//---------------------------------------------------------------------------
BOOL TClientForm::WeAreAlone (LPSTR szName)
{
HANDLE hMutex = CreateMutex (NULL, TRUE, szName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
return FALSE;
}
return TRUE;
}
//---------------------------------------------------------------------------
Но проблема опять же кроется в мьютексах, если приложение будет некоректно завершено, то запустить второй раз приложение без перезагрузки компа ты не сможешь.



Большое спасибо за примерчик bercut, обязательно его испробую, а то что касается зависания, так то не столь важно, надобудет, то перезагрузятся!

Большое спасибо всем!!!

305
29 марта 2003 года
Kashuk
385 / / 21.02.2003
Помогите ещё раз!
А как теперь при повторном запуске проекта зделать так, что б место вывода ошибки, превый запущеный(если был свёрнут, то востанавливался, как Winamp к примеру), подскажите что туна надо записать.

На берёд благодарю!
443
29 марта 2003 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Kashuk
Помогите ещё раз!
А как теперь при повторном запуске проекта зделать так, что б место вывода ошибки, превый запущеный(если был свёрнут, то востанавливался, как Winamp к примеру), подскажите что туна надо записать.


HWND hWnd;

hWnd = FindWindow(AppName, NULL);
if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

Это уже делаешь после проверки существования мьютекса.

421
30 марта 2003 года
bercut
124 / / 20.06.2000
Цитата:
Originally posted by segev
bercut

Сколько раз пытался, так и не удалось завершить приложение так некорректно, чтобы пришлось перезагрузаться. Открой секрет.



Ни каких секретов. У меня это получилось с первого раза, а ты значит плохо пытался. ;-)
А делается это таким образом, хотя не всегда срабатывает, просто прогу надо завершить не через Close(), а чтобы прога убила свой собсвенный процесс в памяти, после чего там оставался мьютекс и загрузить прогу второй раз уже не удавалось. Вот и все.

2.0K
31 марта 2003 года
segev
67 / / 19.01.2003
bercut
Цитата:

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


Как убить процесс ? TerminateProcess ? Пробовал - работает как часы и под Win2k и под Win98. Исходник что ли пришли, а то долго еще трепаться будем :).

421
31 марта 2003 года
bercut
124 / / 20.06.2000
Цитата:
Originally posted by segev
bercut

Как убить процесс ? TerminateProcess ? Пробовал - работает как часы и под Win2k и под Win98. Исходник что ли пришли, а то долго еще трепаться будем :).



Да, ты прав, убиваю процесс именно с помощью TerminateProcess, но т.к. прога убивает сама себя она заверщается не корректно. При этом она не выдает ни каких сообщений и закрывается, но если посмотреть список процессов в памяти, то видно, что она так в памяти и висит и при этом уже ничем не убивается. Исходник высылать не буду, т.к. он не для общего обозрения, а вот готовое приложение могу, которое весит около метра.

2.0K
01 апреля 2003 года
segev
67 / / 19.01.2003
bercut
Цитата:

Да, ты прав, убиваю процесс именно с помощью TerminateProcess, но т.к. прога убивает сама себя она заверщается не корректно. При этом она не выдает ни каких сообщений и закрывается, но если посмотреть список процессов в памяти, то видно, что она так в памяти и висит и при этом уже ничем не убивается.


Как же ты убиваешь процесс, если он висит в памяти ? Что-то ты перемудрил с "убийством". :)
Если программа потом ничем не закрывается, смею предположить дело происходит под 9х, здесь такое бывает. Под NT TerminateProcess работает железно.

421
01 апреля 2003 года
bercut
124 / / 20.06.2000
Нашел еще один способ проверки и наверное самый лучшый, также завязанный с мьютексом.

http://pulsar.34.ru/forum/viewtopic.php?p=2&sid=a42f84cfcc1013afa05a05ff22cb5c3f#2
3.4K
01 апреля 2003 года
meat
10 / / 31.03.2003
Цитата:
Originally posted by segev
bercut писал ...
segev писал ...

Как же ты убиваешь процесс, если он висит в памяти ? Что-то ты перемудрил с "убийством". :)
Если программа потом ничем не закрывается, смею предположить дело происходит под 9х, здесь такое бывает. Под NT TerminateProcess работает железно.



твои б слова да богу в уши
я сам работаю на Win2k и примеров некорректного завершения здесь море
- прога успела вывалиться в режим отладки под системную привелегию и "отлаживается" положив на всех остальных (кстати недавно закрытая дыра в НТ)
- создание дочернего процесса и порождение в нем мьютекса и вызов метода onClose с Active = caFree из другого дочернего процесса (вот это полная лажа системы)
- иногда закрытие приложения во время работы с сокетом
и тд и тп

ЗЫ: покой нам только сниться, а пока глаз да глаз

2.0K
02 апреля 2003 года
segev
67 / / 19.01.2003
meat
Цитата:

я сам работаю на Win2k и примеров некорректного завершения здесь море...


При чем здесь какое-то некорректное завершение чего-то там ?
Речь идет о том, что TerminateProcess всегда выгружает приложение из памяти и закрывает его все дескрипторы объектов ядра (к которым относятся и мьютексы).
За много лет общения с NT-системами ни разу не видел, чтобы приложение нельзя было снять из диспетчера задач (там вызывается именно TerminateProcess).

Цитата:

прога успела вывалиться в режим отладки под системную привелегию и "отлаживается"


Как это понимать и что такое "системная привелегия" ?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог