Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить, запушенна ли програма !!! 
:(
    Опции темы
Bekass
Дата 20.1.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 21.12.2005

Репутация: нет
Всего: нет



Есть прога, ее нельзя запускать еще раз (то есть более 1 одновременно)
Подскажете, как можно определить, запушенна ли програма, что б не запускать ее снова !!! smile
PM MAIL   Вверх
chaos
Дата 20.1.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



можно использовать
FindWindow


PM WWW   Вверх
Earnest
Дата 20.1.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



1) Именованная секция памяти: поместить туда статическую переменную, инициализированную 0. При загрузке проверять, если 0, ставить 1, иначе уже используется - выход.

2) Именованный объект синхронизации, скажем, мьютекс. Все то же самое.


--------------------
...
PM   Вверх
chaos
Дата 20.1.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 4
Всего: 44



вот тебе заготовки
1
Код

HWND hWnd = ::FindWindow(szWindowClass, NULL);
if (::IsWindow(hWnd)) //приложение запущено
{
//.......
}


2 про то что говорил Earnest
Код

#pragma data_seg("MyShared")
voliate LONG g_lApp = 0;
#pragma data_seg()

#pragma comment(linker, "/Section:MyShared,RWS")


че не понятно спрашивай
PM WWW   Вверх
SergeCpp
Дата 20.1.2006, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 5
Всего: 124



Мутекс надёжнее
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.1.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(SergeCpp @ 20.1.2006, 13:40 Найти цитируемый пост)

Мутекс надёжнее

Чем что?



--------------------
...
PM   Вверх
maq
Дата 20.1.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Microsoft тоже рекомендует Мутекс:

http://support.microsoft.com/default.aspx?...kb;en-us;106385

Но вот код

Код

#pragma data_seg("MyShared")
voliate LONG g_lApp = 0;
#pragma data_seg()
#pragma comment(linker, "/Section:MyShared,RWS")


у меня не сработал. Дает ошибку. Может я его не туда включил?
PM MAIL   Вверх
Earnest
Дата 20.1.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Хм? Какую ошибку?
В моем приложении, такой же код, только вместо переменной g_lApp- массив:
Код

static LPARAM s_nArray[2] = { 0,0 };

... работает... уже несколько лет... под MSVC7.1 в том числе...


--------------------
...
PM   Вверх
AlexPro
Дата 21.1.2006, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Earnest @ 20.1.2006, 14:49 Найти цитируемый пост)
Чем что?

Видимо, FindWindow.
Вот что пишет по этому поводу авторитетный товарищ Dr. Joseph M. Newcomer:
Цитата
Одно из распространенных народных мнений гласит, что для запрета выполнения множества экземпляров программы можно использовать функцию API FindWindow. Использование этой функции очень опасно. Ваше приложение имеет отличные шансы навсегда зависнуть при выполнении этого вызова. В любом случае, даже если не существует условий, которые привели бы к зависанию, методы, использующие данную функцию, настолько глубоко ошибочны, что они вообще не имеют шансов нормально работать. Существует два сценария сбоя: приложение не запускается или одновременно запускаются несколько экземпляров. Оба варианта абсолютно неудовлетворительны.

Целиком статью можно прочесть здесь. Рекомендую: интересно и поучительно.

Это сообщение отредактировал(а) AlexPro - 21.1.2006, 07:34
PM MAIL   Вверх
maq
Дата 21.1.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



У меня VS .NET 2005.

Разместил код (как есть)

Код

#pragma data_seg("MyShared")
voliate LONG g_lApp = 0;
#pragma data_seg()
#pragma comment(linker, "/Section:MyShared,RWS")

в CWinApp.cpp перед всеми
Код

#include ...


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

Что я не так сделал?
PM MAIL   Вверх
Earnest
Дата 22.1.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



AlexPro
Действительно, интересная статья.

Цитата(maq @ 21.1.2006, 10:50 Найти цитируемый пост)

Что я не так сделал?

А проверять переменную при запуске и ставить ее в 1 ты не забываешь? smile
Кроме того, хороший тон требует, чтобы вместо повторного запуска происходило "всплытие" уже запущенного экземпляра и передача ему параметров нового запуска (открываемого файла, например), для чего тоже нужны дополнительные действия в InitInstance.
Кстати в приведенной AlexPro статье об этом тоже написано.

Да согласна, вариант с мьютексом надежнее в том плане, что он переносим: все прагмы зависят от компилятора.
Однако, вариант с именованной секцией имеет и свои плюсы: в эту разделяемую переменную можно поместить хандл главного окна запущенного приложения, и не парится потом с поиском - например. А также другую информацию ... Что касается переносимости, то в большинстве компиляторов именованные секции поддерживаются тем или иным способом, т.е. при необходимости портировать вполне можно.

smile
Есть и еще один плюс. Очень многие программисты, начинающие свое обучение сразу с высокоуровневых языков и привыкщие думать только в категориях объектов, в жизни не слыхали об именованных секциях и прочих премудростях линкера. Так что это еще и способ разобраться с более низкоуровневыми понятиями. Зачем нужно знать, о том, что ниже, замечательно написано здесь.




--------------------
...
PM   Вверх
maq
Дата 22.1.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 28.10.2005

Репутация: нет
Всего: нет



Спасибо, Earnest! Но я честно не разобрался!

Добавил такой код, естественно неправильный.

Код

#pragma data_seg("MyShared")
voliate LONG g_lApp = 0;
if(g_lApp == 1) return;
g_lApp = 1;
#pragma data_seg()
#pragma comment(linker, "/Section:MyShared,RWS")


как он правильно должен выглядеть?
PM MAIL   Вверх
Earnest
Дата 22.1.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Конечно, прагмы и секции должны быть вне функций, а код проверки, разумеется, в InitInstance.
То, что ты написал, компилятор должен послать.
А более подробно - почитай внимательно статью, которую привел в этой теме AlexPro. Там и пример есть с разделяемой переменной.

Кстати, по внимательном прочтении статьи, должна признать, только код с мьютексом обеспечивает полную надежность в смысле "Race Conditions". Трюк с секцией работает, но не тогда, когда пользователь долбит по кнопке запуска со скоростью хорошей машинистки. Но, в сочетании с мьютексом, разделяемая переменная позволяет отказаться от поиска окна и прочего шаманства.



--------------------
...
PM   Вверх
AlexPro
Дата 23.1.2006, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Earnest @ 22.1.2006, 18:34 Найти цитируемый пост)
только код с мьютексом обеспечивает полную надежность

Если у меня и были сомнения в механизме реализации топика, то после прочтения статьи был сделан однозначный выбор в пользу мьютекса.
Earnest, спасибо за плюсик smile
PM MAIL   Вверх
takedo
Дата 23.1.2006, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



AlexPro я про то же самое спрашивал, о чем и вы здесь говорите. По поводу Мьютекса - А КАК ТЫ ПОСЛЕ ТОГО КАК НАЙДЁШЬ МЬЮТЕКС ПЕРЕВЕДЕШБ НА ПЕРЕДНИЙ ПЛАН РАЗВЕРНУТОЕ ТО САМОЕ ПРИЛОЖЕНИЕ? Я отказался от мьютекса и сделал через посылку глобального сообщения... Может поделишься как ты по мьютексу определяешь хендл окна?


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.