| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 между чтением и записью в секцию) так что без синхронизации, секции особого смысла не имеют, с меппингом - аналогично |