Шаг 335 - Mutex в MFC

Для подробного ознакомления лучше прочитать MFC: "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 82 - Что такое взаимоисключение (Mutex)", WinAPI: "Шаг 118 - Функции CreateMutex() и ReleaseMutex()".

В MFC для работы с Mutex есть соответствующий класс CMutex. Конструктор у этого класса всего один:

CMutex
( 
	BOOL bInitiallyOwn = FALSE,		// флаг владельца объекта
	LPCTSTR lpszName = NULL,		// Имя объекта
	LPSECURITY_ATTRIBUTES lpsaAttribute = NULL	// флаг защиты
);

Давайте реализуем тот же прием, что в шаге API. Запретим запуск двух приложений. Для этого создаем приложение MFC AppWizard на базе диалогового окна с именем TestMutex.

Работать мы будем в классе приложения. Вот так он у Вас должен называться - CTestMutexApp. Первое это надо включить заголовочный файл класса CMutex:

......
#include "resource.h"	// main symbols
#include "afxmt.h"

//////////////////////
// CTestMutexApp:
......

Для работы нам нужно два объекта классов. Мы их создадим. Сначало опишем:

......
class CTestMutexApp : public CWinApp
{
public:
	CTestMutexApp();
	CMutex* mutex;
	CSingleLock* si;
// Overrides
.......

Потом проинициализируем:

CTestMutexApp::CTestMutexApp()
{
	mutex = new CMutex(FALSE,"FirstStep",NULL);
	si=new CSingleLock(mutex); 
}

При окончании работы их нужно удалить:

int CTestMutexApp::ExitInstance() 
{
	delete si;
	delete mutex;
	return CWinApp::ExitInstance();
}

Все готово, чтобы написать основной код:

///////////////////////////////////
// CTestMutexApp initialization

BOOL CTestMutexApp::InitInstance()
{
    if (!si->Lock(1))
    {
		AfxMessageBox("Error Running"); 
		return FALSE;
    }

	AfxEnableControlContainer();
......

Все просто. Если нам удается заблокировать объект if (!si->Lock(1)), то программа запускается и объект блокируется. А вот если кто-то сделал это ранее, то мы прекращаем инициализацию программы сообщая пользователю. Первый экземпляр запускается без проблем. А вот второй не как, чего и требовалось.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 6.05.2001