|
Программирование >> Формирование пользовательского контейнера
fjjlOronOTOHHOCTb 1J1 3 конце приоритет основного потока повышается до значения thread PRI0RITY AB0VE N0RMAL. Этот уровснь гарантируст то, что приложение подучит достаточное количество времени процессора для того, чтобы обеспе-цить пользовательский ввод вне зависимости от того, какой приоритет у управляемого потока. Этот шаг нужен не во всех случаях. Необходимость его выполнения вы можете установить опытным путем. функция ThreadPanelQ Функция ThreadPanel () - ЭТО Windows-функция обратного вызова (callback function), которая реагирует на взаимодействие пользователя с панелью управления. Как все функции обратного вызова диалогового окна, она получает сообшение каждый раз, когда пользователь изменяет состояние элемента управления. Ей передается дескриптор диалогового окна, в котором произведено действие, сообщение и дополнительная информация, требуемая сообщением. Основной режим функционирования ThreadPanel () такой же, как у любой функции обратного вызова, используемой диалоговым окном. Дальнейшее обсуждение посвящено описанию того, что происходит при получении каждого сообщения. Когда диалоговое окно панели управления потоком создается впервые, она получает сообщение wm initdialog, которое обрабатывается следующим case-оператором. case WM initdialog: Инициализирует список значений приоритета. for(i=0; i<NUMPRIORITIES; i++) { SendDlgltemMessage(hvmd. idd LB, LB ADDSTRING. 0, (LPARAM) priorities[i]); Устанавливает кнопки приостановки и возобновления потока. hpbSus = GetDlgItem(hvmd, idd SUSPEND) ; hpbRes = GetDlgItem(hwnd, idd RESUME); EnableWindow(hpbSus, true); делает доступной кнопку Suspend EnableWindow(hpbRes, false); делает недоступной Resume return 1; Ha инициализирует список приоритетов и устанавливает кнопки Suspend и ume в начальное состояние: первая из них доступна, вторая - нет. юбое взаимодействие пользователя с панелью управления вызывает генерацию сообщения WM c0mmand. При получении такого сообщения извлекается итератор, указывающий на элемент в переменной dialogmap. case WM COMMAND: map<HWND, Threadlnfo:: iterator p = dialogmap. find (hwnd) ; Информация, на которую указывает извлеченный итератор р, будет использоваться для конкретной обработки каждого действия. Поскольку р - итератор отображения, он указывает на объект типа pair, представляющий собой структуру, определенную в библиотеке STL. Эта структура содержит два поля: first и second, соответствующих двум типам данных: ключу и значению В данном случае дескриптор играет роль ключа, а информация о потоке - роль значения. Код, точно описывающий совершенное действие, хранится в младшем слове параметра wParam и используется для управления выполнением оператора switch, который обрабатывает оставшиеся типы сообщений. Далее описан каждый из них. Когда пользователь нажимает кнопку Terminate, управляемый поток завершает выполнение, этот тип сообщения обрабатывается приведенным далее case-оператором. case IDD TERMINATE: TerminateThread(p->second.hThread, 0); Делает кнопку Terminate недоступной. hpbTerm = GetDlgItem(hwnd, IDD TERMINATE); } EnableWindow(hpbTerm. false); не доступна Делает кнопки Suspend и Resume недоступными. hpbSus = GetDlgItem(hwnd, IDD SUSPEND); hpbRes = GetDlgItem(hwnd. IDD RESUME); EnableWindow(hpbSus. false); не доступна Suspend EnableWindow(hpbRes, false); не доступна Resume return 1; Поток останавливается вызовом функции TerminateThreadO. Обратите внимание на способ получения дескриптора потока. Как уже объяснялось, поскольку р - итератор отображения (тар), он указывает на объект типа pair, содержащий ключ в поле first и значение в поле second. Таким образом, дескриптор потока извлекается с помощью выражения p->second.hThread. После остановки потока кнопка Terminate становится недоступной. Остановленный поток нельзя возобновить. Панель управления для завершения выполнения потока использует функцию TerminateThreadO. Как отмечалось ранее, ее надо применять с осторожностью. Если вы используете панель управления для экспериментов с вашими собственными потоками, нужно быть уверенными в отсутствии возможных вредных побочных влияний-Если пользователь нажимает кнопку Suspend, поток приостанавливается-Это действие реализовано приведенной далее последовательностью кода. fh40rOnOT04HOCTb 113 case IDD SUSPEND: SuspendThread(p->second.hThread); Устанавливает состояние кнопок Suspend и Resume. hpbSus = GetDlgItem(hvmd. IDD SUSPEЮ) ; hpbRes = GetDlgItem(hvmd, IDD RESUME) ; EnableWindow(hpbSus, false); делает недоступной Suspend EnableWindow(hpbRes, true); делает доступной Resume p->second.suspended = true; return 1; Для временной остановки потока вызывается функция SuspendThreado. Далее обновляются состояния кнопок: кнопка Resume становится доступной, а кнопка Suspend - недоступной. Такое состояние кнопок защищает пользователя от попытки приостановить поток дважды. Приостановленный поток возобновляется после нажатия кнопки Resume, как показано в приведенном далее фрагменте кода. case IDD RESUME: ResumeThread(p->second.hThread); Устанавливает состояние кнопок Suspend и Resume. hpbSus = GetDlgItem(hwnd, IDD SUSPEND); hpbRes = GetDlgltern(hwnd, IDD RESUME); EnableWindow(hpbSus, true); делает доступной Suspend EnableWindow (hpbRes, false); не доступна Resume p->second.suspended = false; return 1; Выполнение потока возобновляется функцией ResumeThread о, а кнопки Suspend и Resume соответствующим образом меняют свое состояние. Для изменения значения приоритета пользователь дважды щелкает кнопкой мыши по нужному элементу списка priority. Обработка этого события Приведена далее. case IDD LB: Если выбран элемент списка, изменяет приоритет потока, if(HIWORD(wParam)==LBN DBLCLK) { p->second.priority = SendDlgltemMessage(hwnd.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |