![]() |
|
|
![]()
|
|
| Bekass |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 21.12.2005 Репутация: нет Всего: нет |
Есть прога, ее нельзя запускать еще раз (то есть более 1 одновременно)
Подскажете, как можно определить, запушенна ли програма, что б не запускать ее снова !!! |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 4 Всего: 44 |
можно использовать
FindWindow |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Именованная секция памяти: поместить туда статическую переменную, инициализированную 0. При загрузке проверять, если 0, ставить 1, иначе уже используется - выход.
2) Именованный объект синхронизации, скажем, мьютекс. Все то же самое. -------------------- ... |
|||
|
||||
| chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 4 Всего: 44 |
вот тебе заготовки
1
2 про то что говорил Earnest
че не понятно спрашивай |
||||
|
|||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 5 Всего: 124 |
Мутекс надёжнее
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
-------------------- ... |
|||
|
||||
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
Microsoft тоже рекомендует Мутекс:
http://support.microsoft.com/default.aspx?...kb;en-us;106385 Но вот код
у меня не сработал. Дает ошибку. Может я его не туда включил? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Хм? Какую ошибку?
В моем приложении, такой же код, только вместо переменной g_lApp- массив:
... работает... уже несколько лет... под MSVC7.1 в том числе... -------------------- ... |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Видимо, FindWindow. Вот что пишет по этому поводу авторитетный товарищ Dr. Joseph M. Newcomer:
Целиком статью можно прочесть здесь. Рекомендую: интересно и поучительно. Это сообщение отредактировал(а) AlexPro - 21.1.2006, 07:34 |
|||
|
||||
| maq |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
У меня VS .NET 2005.
Разместил код (как есть)
в CWinApp.cpp перед всеми
все нормально компилируется, но можно запустить бесконечное количество программ! Что я не так сделал? |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
AlexPro
Действительно, интересная статья. А проверять переменную при запуске и ставить ее в 1 ты не забываешь? Кроме того, хороший тон требует, чтобы вместо повторного запуска происходило "всплытие" уже запущенного экземпляра и передача ему параметров нового запуска (открываемого файла, например), для чего тоже нужны дополнительные действия в InitInstance. Кстати в приведенной AlexPro статье об этом тоже написано. Да согласна, вариант с мьютексом надежнее в том плане, что он переносим: все прагмы зависят от компилятора. Однако, вариант с именованной секцией имеет и свои плюсы: в эту разделяемую переменную можно поместить хандл главного окна запущенного приложения, и не парится потом с поиском - например. А также другую информацию ... Что касается переносимости, то в большинстве компиляторов именованные секции поддерживаются тем или иным способом, т.е. при необходимости портировать вполне можно. Есть и еще один плюс. Очень многие программисты, начинающие свое обучение сразу с высокоуровневых языков и привыкщие думать только в категориях объектов, в жизни не слыхали об именованных секциях и прочих премудростях линкера. Так что это еще и способ разобраться с более низкоуровневыми понятиями. Зачем нужно знать, о том, что ниже, замечательно написано здесь. -------------------- ... |
|||
|
||||
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
Спасибо, Earnest! Но я честно не разобрался!
Добавил такой код, естественно неправильный.
как он правильно должен выглядеть? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Конечно, прагмы и секции должны быть вне функций, а код проверки, разумеется, в InitInstance.
То, что ты написал, компилятор должен послать. А более подробно - почитай внимательно статью, которую привел в этой теме AlexPro. Там и пример есть с разделяемой переменной. Кстати, по внимательном прочтении статьи, должна признать, только код с мьютексом обеспечивает полную надежность в смысле "Race Conditions". Трюк с секцией работает, но не тогда, когда пользователь долбит по кнопке запуска со скоростью хорошей машинистки. Но, в сочетании с мьютексом, разделяемая переменная позволяет отказаться от поиска окна и прочего шаманства. -------------------- ... |
|||
|
||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
||||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
AlexPro я про то же самое спрашивал, о чем и вы здесь говорите. По поводу Мьютекса - А КАК ТЫ ПОСЛЕ ТОГО КАК НАЙДЁШЬ МЬЮТЕКС ПЕРЕВЕДЕШБ НА ПЕРЕДНИЙ ПЛАН РАЗВЕРНУТОЕ ТО САМОЕ ПРИЛОЖЕНИЕ? Я отказался от мьютекса и сделал через посылку глобального сообщения... Может поделишься как ты по мьютексу определяешь хендл окна?
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
takedo, конечно по мьютексу окно никак не определишь.
Либо надо искать его (EnumWindows+посылка своего сообщения), либо запомнить в разделяемой переменной. Прочитай статью, на которую AlexPro ссылается. Там про все это очень хорошо написано. -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Earnest спасиб
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| AlexPro |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Мьютекс и разделяемая переменная в равных дозах - то что доктор прописал (Dr. Joseph M. Newcomer) EnumWindows может быть потенциально опасной:
Продолжая медицинскую тему, был в моей медицинской практике случай, связанный с FindWindow. Я тогда сидел на Visual FoxPro и о C++ и мьютексах не помышлял.Но FindWindow есть и в фоксе. Запускаться должен был, естественно, единственный экземпляр программы. И, естественно, использовалась FindWindow. Испытания в лабораторных условиях показали неплохие результаты: механизм функционировал. Представьте себе восторг пользователя и мое смущение, когда только что скопированная (на компьютер пользователя) и впервые запущенная программа выдала: "Приложение уже запущено...". А всего-то оказалось, что пользователь создал одноименную с программой папку на рабочем столе, куда и слил программу. Пользователь открывал папку, запускал программу - а дальше FindWindow делала свое черное дело. Это сообщение отредактировал(а) AlexPro - 24.1.2006, 10:48 |
||||
|
|||||
| AlexPro |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 9.11.2005 Где: Санкт-Петербург Репутация: 3 Всего: 4 |
Нда, а если не требуется ничего передавать ранее запущенному приложению - достаточно одного лишь мьютекса.
|
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 5 Всего: 124 |
Ну уж, если передавать... Можно и NAMED PIPE вместо мутекса... Или MAILSLOT...
|
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Создал Mutex, но вот когда запущено под другим пользователем, то никак не хочет определять?
И как сделать? Добавлено @ 13:30 ret_gle = GetLastError() один раз -------------------- я не гольфист - я хоккеист |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 5 Всего: 124 |
LPSECURITY_ATTRIBUTES lpMutexAttributes
For more information, see Synchronization Object Security and Access Rights. MSDN лениво сюда переписывать... сам дальше смотри... Это сообщение отредактировал(а) SergeCpp - 25.1.2006, 13:39 |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
хочешь сказать, что надо задать не 0 и все будет гут? Да вижу, что именно это и хочешь сказать, сейчас гляну
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
SergeCpp
Чего то не могу разобраться, как надо инициализировать lpSecurityDescriptor у SECURITY_ATTRIBUTES -------------------- я не гольфист - я хоккеист |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |