56. Создание рабочего потока. Управление приоритетами потоков
Для создания рабочего потока предназначена функция
AfxBeginThreadбиблиотеки MFC:
CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,
LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0, DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );
Каждый поток внутри родительского процесса начинает свое выполнение с
вызова специальной функции, называемой потоковой функцией. Выполнение потока продолжается до тех пор, пока не завершится его потоковая функция.
Адрес данной функции (т.е. входная точка в поток) передается в параметре pfnThreadProc. Все потоковые функции должны иметь следующий прототип: UINT pfnThreadProc(LPVOID pParam);
Значение параметра pParam функции AfxBeginThread передается потоковой функции в качестве параметра. Это 32-разрядное число может использоваться для любых целей.
Начальный приоритет потока указывается в параметре nPriority. Если этот
параметр равен 0, то используются установки приоритета текущего
(родительского) потока. Каждый поток имеет свой собственный стек. Размер стека указывается в параметре nStackSize. Если этот параметр равен нулю (общепринятый подход), то создаваемому потоку будет выделен стек такого же размера, что и у родительского потока, а при необходимости размер стека может быть увеличен.
Параметр dwCreateFlags определяет состояние выполнения потока. Если
данный параметр равен нулю, поток начинает выполняться немедленно. Если значение этого параметра равно CREATE_SUSPEND, то поток создается временно приостановленным, т.е. ожидающим запуска. Чтобы запустить такой поток, нужно вызвать функцию CWinThread::ResumeThread.
Параметр lpSecurityAttrs является указателем на набор атрибутов прав
доступа, относящийся к данному потоку. Если этот параметр равен NULL, то набор атрибутов будет унаследован от родительского окна.
При успешном завершении функция AfxBeginThread возвращает указатель на объект потока, в противном случае возвращает ноль. Данный указатель
необходимо сохранять, если впоследствии предполагается обращение из
родительского потока к созданному потоку (например, для изменения приоритета или для временного приостановления потока).
Управление приоритетами потоков
С каждым потоком связана определенная установка приоритета. Эта
установка представляет собой комбинацию двух значений: значения общего класса приоритета процесса и значения приоритета самого потока относительно данного класса.
Приоритет потока показывает, сколько времени работы процессора требуется потоку. Для потоков с низким приоритетом требуется мало времени, а для потоков с высоким приоритетом - много времени.
Получить класс приоритета процесса можно с помощью функции
GetPriorityClass, а установить класс приоритета можно с помощью функции
SetPriorityClass. Обе эти функции являются API-функциями и не входят в класс CWinThread.
Ниже показаны константы, соответствующие классам приоритетов в порядке убывания (по умолчанию программе присваивается приоритет
NORMAL_PRIORITY_CLASS; причин менять его, как правило, нет):
REALTIME_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
Изменение приоритета процесса может негативно сказаться на производительности всей системы. Так, например, увеличение класса приоритета программы до REALTIME_PRIORITY_CLASS приведет к захвату программой всех ресурсов процессора.
Приоритет потока процесса (независимо от класса приоритета) говорит о
том, сколько времени процессора занимает отдельный поток в пределах своего процесса. При создании потока ему присваивается нормальный приоритет THREAD_PRIORITY_NORMAL. Но это значение можно изменить, причем даже во время выполнения потока.
Приоритеты потоков контролируются методами класса CWinThread.
Определить значение приоритета можно с помощью метода GetThreadPriority, а изменить его - с помощью метода SetThreadPriority. Ниже приведены константы, соответствующие установкам приоритетов потоков в порядке убывания:
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
Замечание. Благодаря различным сочетаниям значений приоритета
процесса и приоритета потока в Win32 поддерживается 31 различная установка
приоритета.
- 1.Стандартный внешний вид окна приложения Windows.
- 1. Рамка
- 3. Интерфейс Visual Studio. Ресурсы приложения.
- 4. Интерфейс Visual Studio. Окно вывода Output.
- Окно редактирования текстов программ
- 5. Система меню. Меню File, Edit, View.
- Advanced… вывод на экран еще одного меню.
- 6. Система меню. Меню Insert, Project.
- 7. Система меню. Меню Build, Tools. Меню Build
- 8. Мастер создания приложения. Шаг 1,2.
- 9. Мастер создания приложения. Шаг 3,4.
- 10. Мастер создания приложения. Шаг 5,6,7.
- 11. Диалоговые окна и элементы управления
- 12. Формирование нового ресурса диалогового окна.
- 13. Задание идентификаторов диалогового окна.
- 14. Организация вывода диалогового окна на экран.
- 15.Использование элемента управления типа список
- Некоторые методы класса cListBox
- 16. Комбинированные списки (класс cCombobox).
- 17. Использование элементов типа переключатель Статические поля (класс static). Окна редактирования Edit Box. Методы класса cEdit.
- 19. Обработка сообщений. Карты сообщений.
- Некоторые макросы карты сообщений
- 20.Реал-ция обр-ки сообщ-й с пом.ClassWizard. Виды сообщ-й.
- Вкладки диалогового окна ClassWizard.
- Какой класс должен перехватывать сообщение
- Список сообщений
- 21. Команды. Реал-ция обр-ки команд с помощью ClassWizard
- Обновление команд.
- 22. Архитектура «Документ/представление».
- 23. Вывод на экран. Контекст устройства. Классы контекстов устройства в mfc.
- 24.Классы изобразительных средств. Примеры рисования простейших фигур.
- Рисование простейших фигур (пример)
- Изменение размеров и положения окна
- 25. Использование перьев. Работа с кистью.
- Работа с кистью
- 26. Концепция сохран.-восстановл. Объектов. Необходимые действия по сохр.-востан. Объектов класса cDocument. Разбор примера с сериализацией в классе документа.
- Создание класса, обеспечивающего сериализацию данных
- 27. Создание класса, обеспечивающего сохран.-восстан. Объектов. Разбор примера с сериализацией cMessage. Создание класса, обеспечивающего сериализацию данных
- 28. Непосредственное чтение и запись файлов. Класс сFile. Методы сFile. Режимы доступа к файлу.
- 29. Использование на примере основных методов класса cFile (открыть, записать, считать из файла). Использование стандартн. Диалог. Панелей для открытия и записи в файл.
- 30.Панель инструментов и строка состояния. Создание панели инструментов. Добавление и удаление пиктограмм.
- 31.Разработка ф-ций обработки сообщений, связ-х с пиктограммой на панели инструм-в. Класс панели инстр-в.
- 32. Доступ к базам данных в vs. Классы odbc.
- 34. Регистрация бд. Создание заготовки приложения.
- 35.Создание экранной формы для отображ-я содерж-го бд.
- 36.Добавление и удаление записей.
- 37. Сортировка и фильтрация записей.
- 3)Атрибуты данных
- 4) Операции
- 43.Класс cRecordset. Компоненты данных и осн.Методы (открытие набора, получ-е атрибутов результ. Набора IsOpen, IsBof, IsEof, IsDeleted, обновл-е результ. Набора)
- 1)Компоненты данных
- 2)Конструирование
- 44.Класс cRecordset. Компоненты данных и осн.Методы (операции перемещения пo результир-му набору, операции IsFieldDirty, IsFieldNull, Requary, SetFieldDirty, SetFieldNull).
- 1)Компоненты данных
- 45. Класс cRecordset. Переопределяемые методы (DoFieldExchange, GetDefoltSql, GetDefoltConnect).
- 46.Класс cRecordView.
- 1)Создание объекта
- 2)Атрибуты данных
- 47. Основные технологии com. Автоматизация. Перманентность. Моникеры.
- 48. Единообразная передача данных и объекты с подключением.
- 49. Технология ado. Объектная модель, наборы ado.
- 50. Применение ado Data Control и DataGrid Control.
- 2.2. Методические указания
- 51. Удаление, добавление и редактирование записей в технологии ado
- 52.Настройка Эл-тов упр-ния ado Data Control и DataGrid Control из кода приложения
- 53. Возможности AppWizard по созданию приложений, поддерживающих технологию ActiveX.
- 54.Библиотеки динамической компоновки dll
- 55.Создание и использование 32-битовых динамически связываемых библиотек
- 56. Создание рабочего потока. Управление приоритетами потоков
- 57. Синхронизация потоков. Объекты синхронизации и классы mfc.
- Объекты синхронизации и классы mfc.
- 58.Отладка программ в vs. Точка останова. Установка точек останова. Команды и окна отладки.
- Терминология отладки
- Команды и окна отладки
- Команды меню
- Установка точек останова
- Другие окна для отладки
- Окно Memory
- Применение утилиты mfc Tracer
- 59. Отладка программ в vs. Анализ значений переменных. Окно CallStact.