Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > определить, запущена ли программа? |
Автор: andrew_121 18.5.2009, 10:29 |
Нужно определить запущена ли программа дважды. Если один экземпляр уже запущен, убить, и запуститься. |
Автор: Lazin 18.5.2009, 10:47 |
именованый мюьтекс |
Автор: azesmcar 18.5.2009, 10:48 | ||
примерно так
Добавлено @ 10:51 ну да, я это в примере показал ![]() |
Автор: Mechanic 18.5.2009, 10:55 |
Проблема достаточно древняя. Видел отличный, подробнейший разбор методов, с анализом недостатков каждого. Даавно. Понравился. ![]() Может быть, и не здесь, но на похожем форуме.. ;-) Поиск рулит. ![]() Во, кажется нашел. http://rsdn.ru/article/baseserv/avins.xml. И http://forum.sources.ru/index.php?showtopic=192835. |
Автор: andrew_121 18.5.2009, 11:09 |
Ну допустим мьютекс существует, как мне убить тот экземпляр который был запущен ранее. А при завершении программы мьютекс уничтожается? |
Автор: azesmcar 18.5.2009, 11:10 | ||
andrew_121
|
Автор: artsb 18.5.2009, 11:21 |
Если надо убивать уже запущенную прогу, а не ту которая только запустилась, придётся юзать сообщения, чтобы уже запущенная себя убила ![]() |
Автор: andrew_121 18.5.2009, 11:51 |
Это как? |
Автор: azesmcar 18.5.2009, 11:52 | ||
|
Автор: andrew_121 18.5.2009, 11:59 |
azesmcar, Ща попробую. |
Автор: Mechanic 18.5.2009, 12:05 | ||
Скорее всего. Вот только сообщения в кого? Нужно при запуске где-то сохранять или Window.Handle для сообщения, или же ProcessHandle for TerminateProcess. Может быть "атомные" технологии помогут? Хотя, если есть окно - то совсем просто найдется всё, что имеет нужные окна. Окна-то есть? ![]() |
Автор: GremlinProg 18.5.2009, 12:27 | ||||
WM_QUIT конечно поможет, если перед закрытием не потребуется участие пользователя при сохранении каких-либо данных а так - можно создать то же именованое автоматически-сбрасываемое событие и тестировать его в главном цикле сообщений на предмет автоматического сохранения всех данных и завершения приложения, типа такого:
или отдельным потоком аналогично слушать hAbortEvent, так будет немного экономнее, только PostQuitMessage придется заменить на нечто вроде такого: Добавлено через 4 минуты и 22 секунды тогда и окно искать не потребуется:
ps: код azesmcar |
Автор: artsb 18.5.2009, 13:34 |
andrew_121, пример в атаче (BCB 6). Возможно, немного коряво ![]() Такой вариант можешь юзать, если необходимо корректно закрыть прогу, т.е. сохранить какие-то данные и т.п. Иначе просто шли WM_QUIT и не обрабатывай своё сообщение. ![]() |
Автор: Alca 18.5.2009, 14:40 | ||
|
Автор: artsb 18.5.2009, 15:15 |
Alca, надо не себя закрыть, а прогу, которая до этого работала ![]() |
Автор: Alca 18.5.2009, 15:26 |
Значит плохо прочитал топик. ![]() |
Автор: korbian 19.5.2009, 09:07 | ||
GremlinProg, можно одним эвентом обойтись. псевдокод
а после диспатча или в выделенном потоке ваш код с ожиданием события! |
Автор: GremlinProg 19.5.2009, 13:50 | ||||||
korbian, можно, а почему без автомата? это же риск просто не закрыть окно
можно подстраховаться и использовать два события, из которых второй, фидбэк - неавтомат:
а в закрывающемся процессе вызвать PulseEvent для hFeedback Добавлено через 13 минут и 25 секунд
|
Автор: GremlinProg 19.5.2009, 14:06 |
а еще лучше использовать для сигнализации семафор, а не событие, тогда три и более подряд открытых окон разберутся между собой правильно |
Автор: korbian 19.5.2009, 14:06 |
GremlinProg, соглашусь, что ошибался. ![]() Проскользнула идея запользовать тотже евент для фидбэка, но похоже без двух объектов синхронизации действительно не обойтись. |
Автор: GoldFinch 19.5.2009, 19:03 |
создать shared секцию, и хранить в ней флаги, хендлы и т.п. или FileMapping, но секция лучше, т.к. файл один |
Автор: korbian 20.5.2009, 08:32 |
GoldFinch, все равно без синхронизации обращения к общей секции или filemapping не обойтись, а значит мьютексы, эвенты или семафоры. |
Автор: GoldFinch 20.5.2009, 18:21 |
korbian, в большинстве случаев, достаточно volatile флагов |
Автор: GremlinProg 20.5.2009, 18:28 |
не надо мешать огурцы с утюгами для двух разных процессов volatile ни чего не решает, как и взаимоблокировки тут в любом случае нужны объекты ядра, korbian верно говорит |
Автор: GoldFinch 20.5.2009, 20:03 |
GremlinProg, все же тема не о тех случаях когда нужна синхронизация |
Автор: GremlinProg 20.5.2009, 20:57 |
для примера: создай общую секцию с одной переменной типа int запусти 100-200 процессов, которые будут инкрементировать эту переменную и выводить окно со своим номером, если счетчик дощел до пика (для 100 - 100, для 200 - 200) в идеале, на одну серию запусков, всегда должно выводиться окно, но при наложении запусков, этого просто не будет, счетчик не будет доходить до пика (наложение можно имитировать вставкой Sleep между чтением и записью в секцию) так что без синхронизации, секции особого смысла не имеют, с меппингом - аналогично |