|
Программирование >> Формирование пользовательского контейнера
IDD LB, LB GETCURSEL, О, 0); SetThreadPriority(p->second.hThread, p->second. priority-OFFSET); return 1; Обработка списков порождает разнообразные уведомляющие сообщения (notification message), точно описывающие тип происшедшего события. Такие сообщения хранятся в старшем слове параметра wParam. Один из типов уведомляющих сообщений носит имя lbn dblclk, которое означает двойной щелчок кнопкой мыши по элементу списка. Когда такое уведомление получено, извлекается индекс элемента списка с помошью Windows API-функции sendDigitemMessageo, использующей Текущее выделение в списке. Полученное значение индекса применяется для установки нового приоритета потока. Обратите внимание на то, что переменная offset вычитается для нормализации извлеченного значения индекса. В конце концов, когда пользователь закрывает панель управления, посылается сообщение idcancel. Оно обрабатывается приведенной далее последовательностью кода. case IDCANCEL: Если поток приостановлен, когда панель зак£жтается, возобновляет поток, чтобы предотвратить возникновение тупика. i f(p->second.suspended) { ResumeThread(p->second.hThread); p->second.suspended = false; Удаляет этот поток из списка, dialogniap.erase(hvmd); Закрьшает панель. DestroyWindow(hwnd); retixm 1; Если поток был приостановлен, он возобновляется. Это необходимо для исключения возможной тупиковой ситуации или взаимной блокировки потоков. Далее удаляется связанный с этой панелью элемент в отображении dialogmap. В заключение диалоговое окно закрывается с помощью Windows API-функции DestroyWindow (). fUOronOT04HOCTb Демонстрация работы панели управления потоком в листинге 3.2 приведен код программы, включающей в себя панель управления и пример ее использования. Пример вывода программы показан на рис. 3.2. Программа создает главное окно и определяет два дочерних потока. После запуска программы в этих потоках происходит подсчет суммы целых чисел от О до 50 ООО и вывод текущих значений счетчиков в главном окне. Управлять дочерними потоками можно, активизируя их панели управления. Начните выполнение программы с запуска потоков с помощью команды Threads I Start Threads (Потоки Запуск потока) (или нажатием клавиши <F2>) и активизации панелей управления потоками с помощью команды Threads Control Panels (Потоки Панели управления) (или нажатием клавиши <F3>). После того как панели запушены, вы можете менять приоритеты потоков и т. д. Threads Help UsingaThr-чc Thread 1: loop 123132 Thread 2: loop Й190475 Change State Thread Priority Terminate j Resume j Lowest Normal Above Normal Highest Change State Terminate H I [Highest Thread Riority Lowest Below Normal lo, Рис. 3.2. Вывод программы, демонстрирующей работу панелей управления Примечание В задачу этой книги не входит обучение программированию в операционной системе Windows, но функционирование предлагаемой демонстрационной программы настолько очевидно, что будет понятно всем программистам, работающим в этой операционной системе. #include <windows.h> #include <process.h> #include thrdapp.h #include tcp.cpp const int MAX = 500000; LRESULT CALLBACK WindowFunc(HWND, UINT. WPARAM, LPARAM); imsigned stdcall MyThreadKvoid * param); imsigned stdcall MyThread2 (void * param); char str[255]; содержит строки вывода unsigned tidl, tid2; . идентификаторы потоков (ID) HANDLE hThreadl, hThread2; дескрипторы потоков HINSTANCE hInst; дескриптор экземпляра приложения int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR args, int winMode) HWND hvmd; MSG msg; WNDCLASSEX wcl; HACCEL hAccel; Определяет оконный класс (window class). wcl.cbSize = sizeof(WNDCLASSEX); wcl.hlnstance = hThisInst; дескриптор для этого экземпляра wcl. IpszClassName = MyWin ; имя класса окна wcl.IpfnWndProc = WindowFunc; функция окна (window function) wcl.style =0; текущий стиль wcl.hlcon = LoadlconCNULL, IDI APPLICATION); большая пиктограмма wcl.hlconSm = NULL; использует уменьшенную версию большой пиктограммы Листинг 3.2. Демонстрация работы панели управления потоком
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |