|
Программирование >> Формирование пользовательского контейнера
времени. Прежде чем использовать мьютекс, его нужно создать с помощью функции createMutex (), чей прототип приведен далее. jjjjDLE CreateMutex(LPSECURITYTTRIBUTES secAttr. BOOL acquire, LPCSTR name); Параметр secAttr - это указатель на атрибуты защиты. Если secAttr равен l, применяется дескриптор защиты по умолчанию. Если создающийся поток хочет контролировать мьютекс, параметр acquire должен быть равен true, в противном случае - false. Параметр name указывает на строку, которая становится именем объекта-мьютекса. Мьютексы - глобальные объекты и могут применяться в разных процессах. Если каждый из двух процессов откроет мьютекс с одним и тем же именем, оба будут ссылаться на один и тот же мьютекс. В этом случае оба процесса можно синхронизировать. Имя может быть null, тогда семафор локализован в одном процессе. Функция CreateMutex о Возвращает дескриптор семафора, если завершается успешно, или NULL при возникновении ошибки. Дескриптор мьютекса автоматически закрывается, когда завершается основной процесс. Вы можете явно закрыть дескриптор мьютекса, если он больше не нужен, вызвав функцию CloseHandle(). Создав семафор, вы используете его в дальнейшем с помощью двух функций: WaitForSingleObjectо И ReleaseMutex(). Их прототипы приведены далее. DWORD WaitForSingleObject(HANDLE hObject, DWORD howLong); bool ReleaseMutex(HANDLE hMutex); <1нкция WaitForSingleObject 0 ждет объект синхронизации. Она не возвращается в программу до тех пор, пока объект не станет доступным или не исчерпается отведенное время. Если она используется для работы с мьютек-сом, то параметр hobject содержит дескриптор мьютекса. Параметр howLong задает время ожидания в мс для вызывающей объект процедуры. Как только время истекло, возвращается ошибка истечения времени ожидания (time-out error). Для неопределенно долгого ожидания используйте значение infinite При успешном завершении функция возвращает значение wait object o (это означает, что доступ предоставлен). Если же исчерпано время ожидания, возвращается значение wait timeout. Функция ReleaseMutex о освобождает мьютекс и позволяет другому потоку запрашивать его. Параметр hMutex содержит дескриптор мьютекса. Функция Возвращает ненулевое значение при успешном завершении и О - при возникновении ошибки. Если вы используете мьютекс для управления доступом к разделяемому ресурсу, вставьте фрагмент кода, организующий этот доступ межу вызовами функций waitForSingieobjecto И ReieaseMutex (), как показано В приведенной далее общей схеме (конечно, время ожидания будет разным у различных приложений). if(WaitForSingleObject(hMutex, 10000)== WAIT TIMEOUT); { обработка превышения времени ожидания доступ к ресурсу ReieaseMutex(hMutex); Как правило, вы зададите превыщение времени ожидания, которое будет больше времени, требующегося для выполнения необходимых действий в вашей профамме. Если ошибки превышения времени ожидания будут повторяться при разработке многопоточного приложения, это значит, что вы создали тупиковую ситуацию (deadlock condition). Она возникает, когда один поток ожидает мьютекса, который другой поток никогда не освобождает. Создание панели управления потоком Когда вы создаете многопоточные профаммы, часто бывает полезно поэкспериментировать с разными значениями приоритета. Неплохо иметь возможность динамически приостанавливать и возобновлять выполнение потока и даже завершать его. Как вы увидите, это очень легко сделать, используя уже описанные функции для создания панели управления, которая позволит вам выполнить эти действия. Позднее вы сможете применить панель управления во время работы ваших многопоточных приложений. Динамическая природа панели управления потоком позволит легко изменять конфигурацию выполнения потока и наблюдать результат. Разрабатываемая в этом разделе панель управления способна управлять одним потоком. Но вы можете создать столько панелей, сколько нужно, каждая из которых будет управлять отдельным потоком. Для простоты панель управления реализована как немодальное или безрежимное (modeless) диалоговое окно, принадлежащее рабочему столу (desktop), а не приложению, потоком которого она управляет. Панель управления потоком способна выполнять следующие действия: П задавать приоритет; П приостанавливать поток; П возобновлять поток; П завершать поток. fJlHOronOTOHHOCTb о; Control Panel for T Change Slate Thiead Piiaily Tefminate Lowest . , Below Normal Suspend I iffflyyff[f . , Above Normal - I Highest Done Рис. 3.1. Диалоговое окно панели управления Она также выводит на экран текущее значение приоритета потока. Вид панели управления показан на рис. 3.1. Как уже сказано, панель управления - немодальное диалоговое окно. Следовательно, при его активизации остальная часть приложения также остается активной. И таким образом, панель управления выполняется независимо от применяющей ее профаммы. Панель управления потоком Код панели управления потоком приведен в листинге 3.1. Он хранится в файле tcp.cpp. г 3.1. Панель управления потоком #include <inap> #include <windows.h> #include panel.h using namespace std; const int NUMPRIORITIES = 5; const int OFFSET = 2; Массив строк для списка приоритетов. char priorities[NUMPRIORITIES][80] = { Lowest , Below Normal . Normal . Above Normal .
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |