|
Программирование >> Формирование пользовательского контейнера
Перевод критичный во (по) времени не очень удачный, так как сам нуждается в дополнительном толковании. - Пер. ных значений приоритета, которые может иметь поток (если вы решите адаптировать код для применения в другой операционной системе, возможно, потребуется другое количество). С помощью панели управления вы можете задать одно из следующих значений приоритета: □ thread priority highest; □ thread priority above normal; □ thread priority normal; П thread priority below normal; П THREAD PRIORITY LOWEST. Два оставшихся значения приоритета, thread priority time critical и thread PRioRiTY iDLE, НС подцерживаются панслью управления из-за малого практического значения. Если вы хотите создать приложение, строго соблюдающее заданные параметры времени или сильно от них зависящее (time-critical), лучше присвоить ему класс приоритета, позволяющий функционировать в режиме реального времени (time-critical). Переменная offset определяет величину сдвига, которая будет использоваться при переходе от индексов списка к значениям приоритета. Вам следует помнить, что нормальному приоритету соответствует числовое значение 0. Высший приоритет (thread priority highest) равен 2, а низший (thread. priority lowest) - -2. Поскольку индексы в списке начинаются с О, необходим сдвиг для преобразования номера элемента списка в значение приоритета. Далее объявляется класс ThrdctriPanei. Объявление начинается следующим образом. Класс для панели управления потоком, class ThrdCtrlPanel { Данные управляемого потока, struct Threadlnfo { HANDLE hThread; дескриптор потока int priority; текущий приоритет bool suspended; true, если приостановлен Threadlnfo(HANDLE ht, int p, bool s) { hThread = ht; priority = p; suspended = s; 11Грпоючность У09 Это отображение (тар) содержит данные типа Threadlnfo для каждой активной панели управления потоком, static map<HWND. Threadlnfo dialogmap; Данные управляемого потока содержатся в структуре типа Threadlnfo. Дескриптор потока хранится в переменной hThread. Его приоритет - в переменной priority. Если поток приостановлен, переменная suspended равна true, в противном случае - false. Статический член dialogmap - контейнер библиотеки STL типа тар (слображение), который связывает данные потока с дескриптором диалогового окна, используемого для управления потоком. Поскольку несколько панелей управления могут быть активны в одно и то же время, должен быть способ определить, какой поток управляется какой панелью. Переменная dialogmap И служит ДЛЯ ЭТОЙ цели. Конструктор класса ThrdCtrlPanel Далее приведен код конструктора класса ThrdctriPanei. Конструктор передает дескриптор экземпляра приложения (instance handle) и дескриптор управляемого потока. Дескриптор экземпляра необходим для создания диалогового окна панели управления. Создает панель управления потоком. ThrdCtrlPanel:: ThrdCtrlPanel (HINSTANCE hInst, HANDLE hThrd) Threadlnfo ti (hThrd, GetThreadPriority(hThrd)+OFFSET. false); Окно-владелец - рабочий стол. HWND hDialog = CreateDialog(hInst, ThreadPanelDB , NULL. (DLGPROC) ThreadPanel); Помещает информацию об этом диалоговом окне в отображение тар. <3ialogmap. insert (pair<HWND, Threadlnfo (hDialog, ti)); Устанавливает заголовок панели управления, char str[80] = Control Panel for Thread ; char str2[4]; itoa(dialogniap.size(), str2, 10); streat(str. str2); SetWindowText(hDialog, str); Сдвигает каждый экземпляр диалогового окна. MoveWindow(hDialog, 30*dialoginap.size(), BOMialogmap. size (), 300, 250, 1); Обновляет значение приоритета в списке. SendDlgItemMessage(hDialog, IDD LB, LB SETCURSEL, (WPARAM) ti.priority, 0); Увеличивает приоритет для гарантированного управления. Вы можете изменить или удалить этот оператор в соответствии с характеристиками вашей среды исполнения. SetThreadPriority(GetCurrentThread(), THREAD PRIORITY ABOVE NORMAL); Конструктор начинается с создания экземпляра структуры Threadlnfo с именем ti, который содержит начальные характеристики потока. Обратите внимание на то, что значение приоритета получается с помощью вызова функции GetThreadPriorityO ДЛЯ управляемого потока. Далее создается диалоговое окно панели управления с помощью функции createDialogO. Windows API-функция CreateDialogO создает немодальное диалоговое окно, не зависящее от приложения, его создавшего. Она возвращает дескриптор этого окна, который запоминается в переменной hDialog. Затем переменная hDiaiog И данные потока, содерхсашиеся в переменной ti, сохраняются в отображении dialogmap. Таким образом, поток связывается с диалоговым окном, которое им управляет. Далее устанавливается заголовок диалогового окна для отображения номера потока. Номер потока формируется на основе номера элемента в отображении dialogmap. Альтернативой, которую вы можете попробовать реализовать, служит явная передача имени для каждого потока конструктору класса ThrdCtrlPanel. Для примера, разрабатываемого в этой главе, достаточно номера потока. Далее окно панели управления слегка сдвигается с помошью другой Windows API-функции Movewindow (). Такой сдвиг позволит нескольким панелям отображаться на экране без полного перекрытия ранее созданной панели вновь создаваемой. Значение приоритета потока выводится в списке с помощью вызова API-функции SendDlgltemMessage ().
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |