Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Домашнее задание.

Добавьте в немодальное окно различные элементы управления и напишите код для вывода данных в основное окно программы.

Лекция 5. Обработка сообщений Windows и программирование многопоточных приложений Методические рекомендации

Так как материал данной лекции достаточно сложен для первичного восприятия, то необходимо пользоваться наглядными примерами. Очень хорошо для этого подходит Microsoft Word. Сама программа представляет собой приложение. Если ее запустить, то мы получим процесс. Если мы запустим программу еще раз, то получим новый процесс, хотя приложение будет тем же. Внутри каждого из этих процессов выполняется несколько потоков имеющих доступ к глобальным данным внутри одного процесса таким как документ, абзац, шрифт. Примерами потоков могут служить такие сервисы предоставляемые программой как автоматическая проверка правописания, автосохранение, выравнивание абзаца.

План

  1. Понятие процесса и потока

  2. Обработка сообщений в однопоточной программе

  3. Программирование многопоточных приложений

  4. Критические секции

Вытесняющая многозадачность и многопоточность Win32 произвели настоящую революцию в программировании для Windows. Вообще-то, можно разрабатывать полезные однопоточные приложения для Windows. Но, изучив основы многопоточности, Вы сможете создавать более эффективные и мощные программы.

Понятие процесса и потока

Процессом называется выполняемое приложение, обладающее собственной памятью, описателями файлов и другими системными ресурсами.

Потоком называется код, исполняемый внутри процесса.

Процесс может иметь как один поток, так и множество параллельно выполняющихся потоков.

Все пространство кода и данных процесса доступно всем его потокам. Несколько потоков могут обращаться к одним и тем же глобальным переменным или функциям.

Потоками управляет операционная система, и у каждого потока есть свой собственный стек.

Обработка сообщений в однопоточной программе

До сих пор все наши программы были однопоточными (single-threaded), т. е. у кода был лишь один поток исполнения. Казалось бы, при появлении сообщения каким-то чудом вызывается ваш обработчик, но в Windows все происходит совсем не так. Глубоко в недрах MFC-кода, компонуемого с вашей программой, спрятаны такие инструкции:

MSG message;

while ( GetMessage (&message, NULL, 0, 0))

{

::TranslateMessage(&inessage);

::DispatchMessage(&iressage);

}

Windows определяет, какие сообщения принадлежат программе, а функция GetMessage возвращает управление, как только появляется сообщение для обработки. Если сообщений нет, программа приостанавливается, и выполняются другие приложения. Когда сообщение в конце концов поступает, программа “пробуждается” Функция TranslateMessage транслирует сообщения WM_KEYDOWN в сообщения WM_CHAR, содержащие ASCII-символы, а функция DispatcbMessage передает управление (через оконный класс) коду выборки сообщений MFC, который вызывает Вашу функцию на основе таблицы обработчиков сообщений. Когда обработчик завершается, он возвращает управление MFC-коду, что в итоге вызывает возврат из DispatcbMessage.