Программирование >>  Формирование пользовательского контейнера 

1 ... 32 33 34 [ 35 ] 36 37 38 ... 156


Перевод критичный во (по) времени не очень удачный, так как сам нуждается в дополнительном толковании. - Пер.

ных значений приоритета, которые может иметь поток (если вы решите адаптировать код для применения в другой операционной системе, возможно, потребуется другое количество). С помощью панели управления вы можете задать одно из следующих значений приоритета:

□ 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 ().



1 ... 32 33 34 [ 35 ] 36 37 38 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика