|
Программирование >> Формирование пользовательского контейнера
-Highest }; Класс для панели управления потоком, class ThrdCtrlPanel { Данные управляемого потока, struct Threadlnfo { HANDLE hThread; дескриптор потока int priority; текущий приоритет bool suspended; true, если поток приостановлен Threadlnfo(HANDLE ht, int p, bool s) { hThread = ht; priority = p; suspended = s; Это отображение (map) содержит данные типа Threadlnfo для каждой активной панели управления потоком, static map<HWND, Threadlnfo dialogmap; public: Конструирует панель управления. ThrdCtrlPanel(HINSTANCE hinst, HANDLE hThrd); callback-функция панели управления. static LRESULT CALLBACK ThreadPanel(HWND hvmd, UINT message, WPARAM wParam. LPARAM IParam) ; Определяет статический элемент dialogmap. map<HWND, ThrdCtrlPanel::Threadlnfo ThrdCtrlPanel::dialogmap; Создает панель управления потоком. ThrdCtrlPanel::ThrdCtrlPanel(HINSTANCE hInst, HANDLE hThrd) Threadlnfo ti(hThrd, GetThreadPriority(hThrd)+OFFSET, false); Окно-владелец - рабочий стол, UWND hDialog = CreateDialog(hInst, ThreadPanelDB , NULL, (DLGPROC) ThreadPanel); Помещает информацию об этом диалоговом окне в отображение тар. dialogmap.insert(pair<HWND, rhreadInfo>(hDialog, ti)); Устанавливает заголовок панели управления, char str[80] = Control Panel for Thread ; char str2[4]; itoa(dialogmap.SizeO , str2, 10); strcat(str, str2); SetWindowText(hDialog, str); Сдвигает кс1ждый экземпляр диалогового окна. MoveWindow(hDialog, 30*dialogmap.size(), 30*dialogmap.size(), 300. 250, 1); Обновляет значение приоритета в списке. SendDlgltertMessage (hDialog, IDD LB,. LB SETCURSEL, (WPARAM) ti.priority, 0); Увеличивает приоритет для гарантированного управления. Выможете изменить или удалить этот оператор в соответствии с характеристиками вашей среды исполнения. SetThreadPriority (GetCurrentThread (), THREAD PRIORITY AЮVEJOHMAL) ; 1 callback-функция диалогового окна панели управления. ESDLT CALLBACK ThrdCtrlPanel::ThreadPanel (HWND hvmd, UINT message, WPARAM wParam, LPARAM IParam) int i; HWND hpbRes, hpbSus, hpbTerm; switch (message) { case WM INITDIALOG: Инициализирует список значений приоритета. for(i=0; i<NUMPRIORITIES; i++) { SencaDlgltertMessage (hwnd, IDD LB, LB ADDSTRING, 0, (LPARAM) priorities[i]); Устанавливает кнопки приостановки и возобновления потока. hpbSus = GetDlgItem(hwnd. IDD SUSPEND) ; hpbRes = GetDlgItem(hwnd, IDD RESUME) ; EnableWindow(hpbSus, true); делает доступной кнопку Suspend EnableWindow(hpbRes, false); делает недоступной Resxme, return 1; case WM COMMAND: map<HWND, Threadlnfo:: iterator p = dialogmap. find (hwnd); switch(LOWORD(wParam)) { case IDD TERMINATE: TerminateThread(p->second.hThread, 0); Делает кнопку Terminate недоступной, hpbrerm = 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; case IDD SUSPEND: SuspendThread(p->second.hThread); Устанавливает состояние кнопок Suspend и Resume.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |