C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
как побороть mutex, запуск более одной копии проги
joynter
Отправлено: 18.10.2004, 14:37


Станционный диспетчер

Группа: Участник
Сообщений: 137



необходимо разрешить проге запускаться множеством копий.
дайте, пожалуйста пинка в правильном направлении.
Gedeon
Отправлено: 18.10.2004, 15:21


Ветеран

Группа: Модератор
Сообщений: 1742



Так а разве проблема с тем, чтоб запускать много копий программы возникает по умолчанию? Создаешь проект и запускай сколько влезет, обычно у народа проблемы, чтоб больше одной не запускалось или я вопроса не понял?
joynter
Отправлено: 18.10.2004, 15:48


Станционный диспетчер

Группа: Участник
Сообщений: 137



заранее известно, сто в винмайне стоит мьютекс
Gedeon
Отправлено: 18.10.2004, 16:22


Ветеран

Группа: Модератор
Сообщений: 1742



Прога я так понимаю не Ваша? А имя мьютекса известно? Побольше бы информации.
joynter
Отправлено: 18.10.2004, 16:46


Станционный диспетчер

Группа: Участник
Сообщений: 137



2Gedeon
Давайте рассмотрим общий случай с именем мьютекса, например, any_name.
Gedeon
Отправлено: 19.10.2004, 11:43


Ветеран

Группа: Модератор
Сообщений: 1742



Ну так тогда просто все, делаем программу запускающую нужную
CODE

#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "any_name");
   if(hMutex) ReleaseMutex(hMutex);
   CreateProcess(...); // тут запускаем саму прогу
   return 0;
}
//---------------------------------------------------------------------------
joynter
Отправлено: 19.10.2004, 13:21


Станционный диспетчер

Группа: Участник
Сообщений: 137



я мож чего не понимаю, но по-моему именно так в основной проге и реализована блокировка запуска второй копии. меня обратный вопрос интересует
Gedeon
Отправлено: 19.10.2004, 13:56


Ветеран

Группа: Модератор
Сообщений: 1742



Вы хоть бы посмотрели внимательно, а потом бы говорили. Защита реализуется вот так
CODE

   try
   {
        // Пытаемся открыть мьютекс.
       HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "EmailNotifier2");

       if(!hMutex)
           hMutex = CreateMutex(0, 0, "EmailNotifier2"); // если его нет, то создаем и продолжаем работу программы
       else
           return 0; // иначе завершаем программу

     
       //дальше работает наше приложение
       Application->Initialize();
       Application->CreateForm(__classid(TF_MainForm), &F_MainForm);
        Application->Run();
       //а вот после выхода убиваем мьютекс
       ReleaseMutex(hMutex);
   }
   catch (Exception &exception)
   {
       Application->ShowException(&exception);
   }

В коде который я написал до этого, если мьютекс существует, я его сразу убиваю и запускаю после этого нужную программу.
joynter
Отправлено: 19.10.2004, 15:02


Станционный диспетчер

Группа: Участник
Сообщений: 137



2Gedeon
извините — сразу не разобрался, что ReleaseMutex(hMutex) возвращает false и принял ваш код за вызов мьютекса.

Вернуться в Вопросы программирования в C++Builder