Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определить, запущена ли программа? Если задача именуеься так же 
V
    Опции темы
andrew_121
Дата 18.5.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Нужно определить запущена ли программа дважды. Если один экземпляр уже запущен, убить, и запуститься.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 18.5.2009, 10:46 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(andrew_121 @  18.5.2009,  10:29 Найти цитируемый пост)
Нужно определить запущена ли программа дважды. Если один экземпляр уже запущен, убить, и запуститься. 

Создавай мютекс, при старте программы проверяй его наличие.
Функция CreateMutex
PM   Вверх
Lazin
Дата 18.5.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(azesmcar @  18.5.2009,  10:46 Найти цитируемый пост)
Создавай мютекс, при старте программы проверяй его наличие.

именованый мюьтекс
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 18.5.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



примерно так
Код

if (CreateMutex(NULL, false, "MYMUTEXUNIQUENAME") == 0 || GetLastError() == ERROR_ALREADY_EXISTS)
{
    //Program is already running!
}


Добавлено @ 10:51
Цитата(Lazin @  18.5.2009,  10:47 Найти цитируемый пост)
именованый мюьтекс 

ну да, я это в примере показал smile 

Это сообщение отредактировал(а) azesmcar - 18.5.2009, 11:05
PM   Вверх
Mechanic
Дата 18.5.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

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



Проблема достаточно древняя. Видел отличный, подробнейший разбор методов, с анализом недостатков каждого. Даавно. Понравился.  smile 
Может быть, и не здесь, но на похожем форуме.. ;-)
Поиск рулит.  smile 

Во, кажется нашел.
Как избежать запуска нескольких экземпляров приложения (by Dr. Joseph M. Newcomer).
И вот про сессии юзеров наглядно.

Это сообщение отредактировал(а) Mechanic - 18.5.2009, 11:11
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
andrew_121
Дата 18.5.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Ну допустим мьютекс существует, как мне убить тот экземпляр который был запущен ранее.
А при завершении программы мьютекс уничтожается?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 18.5.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



andrew_121

Цитата

Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed. 
 
PM   Вверх
artsb
Дата 18.5.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(andrew_121 @  18.5.2009,  10:29 Найти цитируемый пост)
Если один экземпляр уже запущен, убить, и запуститься.

Если надо убивать уже запущенную прогу, а не ту которая только запустилась, придётся юзать сообщения, чтобы уже запущенная себя убила  smile 

Это сообщение отредактировал(а) artsb - 18.5.2009, 11:23


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
andrew_121
Дата 18.5.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(artsb @  18.5.2009,  11:21 Найти цитируемый пост)
придётся юзать сообщения

Это как?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 18.5.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(andrew_121 @  18.5.2009,  11:51 Найти цитируемый пост)
Это как? 

Код

SendMessage(handle, WM_QUIT ... );

PM   Вверх
andrew_121
Дата 18.5.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



azesmcar, Ща попробую.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Mechanic
Дата 18.5.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

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



Цитата(artsb @  18.5.2009,  11:21 Найти цитируемый пост)
Если надо убивать уже запущенную прогу, а не ту которая только запустилась, придётся юзать сообщения, чтобы уже запущенная себя убила  smile 


Скорее всего. Вот только сообщения в кого? Нужно при запуске где-то сохранять или Window.Handle для сообщения, или же ProcessHandle for TerminateProcess. Может быть "атомные" технологии помогут?

Хотя, если есть окно - то совсем просто найдется всё, что имеет нужные окна.
Окна-то есть?  smile 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
GremlinProg
Дата 18.5.2009, 12:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



WM_QUIT конечно поможет, если перед закрытием не потребуется участие пользователя при сохранении каких-либо данных

а так - можно создать то же именованое автоматически-сбрасываемое событие и тестировать его в главном цикле сообщений на предмет автоматического сохранения всех данных и завершения приложения, типа такого:
Код

while( ::GetMessage(...) ){

  Translate...
  Dispatch...

  if( ::WaitForSingleObject(hAbortEvent,0) == WAIT_OBJECT_0 ){
    save_quietly_all();
    ::PostQuitMessage(S_OK);
  }

}

или отдельным потоком аналогично слушать hAbortEvent, так будет немного экономнее, только PostQuitMessage придется заменить на нечто вроде такого:
Цитата(azesmcar @  18.5.2009,  13:52 Найти цитируемый пост)
SendMessage(handle, WM_QUIT ... );


Добавлено через 4 минуты и 22 секунды
тогда и окно искать не потребуется:
Код

if (CreateMutex(NULL, false, "MYMUTEXUNIQUENAME") == 0 || GetLastError() == ERROR_ALREADY_EXISTS){
  ::SetEvent(hAbortEvent);
}

ps: код azesmcar


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
artsb
Дата 18.5.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



andrew_121, пример в атаче (BCB 6). Возможно, немного коряво smile

Такой вариант можешь юзать, если необходимо корректно закрыть прогу, т.е. сохранить какие-то данные и т.п. Иначе просто шли WM_QUIT и не обрабатывай своё сообщение.  smile 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  close.rar 198,57 Kb


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 18.5.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

//---------------------------------------------------------------------------
bool bWeAreAlone(LPWSTR wzName) {
    HANDLE hMutex = CreateMutex(NULL,TRUE, wzName);
    if (GetLastError() == ERROR_ALREADY_EXISTS) {
        CloseHandle(hMutex);
        return false;
    } else {
        return true;
    }
}
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
    //-------------------------------------
    //запущена ли прога?
    if (bWeAreAlone(L"Start_Unique_Name") == false) {
        return 0;
    }
    ....
}
//---------------------------------------------------------------------------



--------------------
PM WWW ICQ Skype Jabber   Вверх
artsb
Дата 18.5.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Alca, надо не себя закрыть, а прогу, которая до этого работала  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alca
Дата 18.5.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Значит плохо прочитал топик.  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
korbian
Дата 19.5.2009, 09:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GremlinProg, можно одним эвентом обойтись.

псевдокод
Код

if( !OpenEvent(...) )
{
    CreateEvent(...); // эвент несигнализирующий :)
}
else
{
    SetEvent(...);
    ResetEvent(...);
}

а после диспатча или в выделенном потоке ваш код с ожиданием события!


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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



korbian, можно, а почему без автомата? это же риск просто не закрыть окно
Код

hAbortEvent = ::CreateEvent(NULL, FALSE, FALSE, "MYEVENT");
if( ::GetLastError() == ERROR_ALREADY_EXISTS ){
  ::SetEvent(hAbortEvent);
}

можно подстраховаться и использовать два события, из которых второй, фидбэк - неавтомат:
Код

hFeedback   = ::CreateEvent(NULL, TRUE, FALSE, "MYFBEVENT");
hAbortEvent = ::CreateEvent(NULL, FALSE, FALSE, "MYEVENT");
if( GetLastError() == ERROR_ALREADY_EXISTS ){
  ::SignalObjectAndWait(hAbortEvent,hFeedback,INFINITE);
}

а в закрывающемся процессе вызвать PulseEvent для hFeedback

Добавлено через 13 минут и 25 секунд
Цитата(GremlinProg @  19.5.2009,  15:50 Найти цитируемый пост)
::SignalObjectAndWait(hAbortEvent,hFeedback,INFINITE);

Код

::SignalObjectAndWait(hAbortEvent,hFeedback,INFINITE,FALSE);



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 19.5.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



а еще лучше использовать для сигнализации семафор, а не событие, тогда три и более подряд открытых окон разберутся между собой правильно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
korbian
Дата 19.5.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GremlinProg, соглашусь, что ошибался. smile
Проскользнула идея запользовать тотже евент для фидбэка, но похоже без двух объектов синхронизации действительно не обойтись. 


--------------------
korbian ©
PM   Вверх
GoldFinch
Дата 19.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



создать shared секцию, и хранить в ней флаги, хендлы и т.п.
или FileMapping, но секция лучше, т.к. файл один 
PM MAIL ICQ   Вверх
korbian
Дата 20.5.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, все равно без синхронизации обращения к общей секции или filemapping не обойтись, а значит мьютексы, эвенты или семафоры.


--------------------
korbian ©
PM   Вверх
GoldFinch
Дата 20.5.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



korbian, в большинстве случаев, достаточно volatile флагов
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  20.5.2009,  20:21 Найти цитируемый пост)
в большинстве случаев, достаточно volatile флагов

не надо мешать огурцы с утюгами
для двух разных процессов volatile ни чего не решает, как и взаимоблокировки
тут в любом случае нужны объекты ядра, korbian верно говорит


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 20.5.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



GremlinProg, все же тема не о тех случаях когда нужна синхронизация
PM MAIL ICQ   Вверх
GremlinProg
Дата 20.5.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  20.5.2009,  22:03 Найти цитируемый пост)
тема не о тех случаях когда нужна синхронизация

для примера: создай общую секцию с одной переменной типа int
запусти 100-200 процессов, которые будут инкрементировать эту переменную и выводить окно со своим номером, если счетчик дощел до пика (для 100 - 100, для 200 - 200)

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

так что без синхронизации, секции особого смысла не имеют, с меппингом - аналогично


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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