cout<<"Now releasing the object.\n";
cout.flush;
ReleaseMutex(mutex);
}
// закрываем дескриптор
CloseHandle(mutex);
}
Для проверки работы мьютекса запустите сразу два экземпляра этого приложения. Первый экземпляр сразу захватит объект и освободит его только через 10 секунд. Только после этого второму экземпляру удастся захватить объект. В данном примере объект используется для синхронизации между процессами, поэтому он обятельно должен иметь имя.
Cинхронизация в MFC
Библиотека MFC содержит специальные классы для синхронизации потоков (CMutex, CEvent, CCriticalSection и CSemaphore). Эти классы соответствуют объектам синхронизации WinAPI и являются производными от класса CSyncObject. Чтобы понять, как их использовать, достаточно просто взглянуть на конструкторы и методы этих классов – Lock и Unlock. Фактически эти классы – всего лишь обертки для объектов синхронизации.
Eсть еще один способ использования этих классов – написание так называемых
С классами синхронизации MFC можно работать как напрямую, используя методы Lock и Unlock, так и через промежуточные классы CSingleLock и CMultiLock (хотя на мой взгляд, работать через промежуточные классы несколько неудобно. Но использование класса СMultiLock необходимо, если вы хотите следить за состоянием сразу нескольких объектов).
Заключение
Игнорируя возможности многозадачности, которые предоставляет Windows, вы игнорируете преимущества этой операционной системы. Как вы могли убедиться, многозадачность – это вовсе не так сложно, как кажется на первый взгляд.
Тем, кто интересуется этой темой, могу порекомендовать следующие статьи и разделы MSDN:
• Platform SDK / Windows Base Services / Executables / Processes and Threads
• Platform SDK / Windows Base Services / Interprocess Communication / Synchronization
• Periodicals 1996 / MSJ / December / First Aid For Thread-impaired:Using Multiple Threads with MFC
• Periodicals 1996 / MSJ / March / Win32 Q&A
• Periodicals 1997 / MSJ / July / C++ Q&A.
• Periodicals 1997 / MSJ / January / Win32 Q&A.
Q. Как включать в проект незарегистрированный компонент ActiveX? Вернее он на моей машине зарегистрирован, а на другой нет, и в результате этого программа на той машине вообще не запускается.
A1 Большинство средств дистрибутирования (InstallShield, Wise, Windows Installer, etc.) позволяют регистрировать ActiveX-элементы в процессе инсталляции. При инсталляции "руками" можно вызвать regsvr32.exe и передать ей параметром исполняемый файл ActiveX-элемента. Если Вы сами пишете программу инсталляции – вызовите ф-ию DllRegisterServer из исполняемого файла ActiveX.
Но при этом помните – для использования чужого ActiveX в коммерческих проектах необходимо иметь на то лицензию.