C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 335 - Mutex в MFC / MFC шаг за шагом / Visual C++

Шаг 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)), то программа запускается и объект блокируется. А вот если кто-то сделал это ранее, то мы прекращаем инициализацию программы сообщая пользователю. Первый экземпляр запускается без проблем. А вот второй не как, чего и требовалось.


| |
Автор Каев Артем.
[AD]