- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 2. Основы программирования. Работа с классом Вид. Методические рекомендации:
- •Интерфейс графического устройства
- •Работа с gdi объектами
- •Пример создания нового gdi объекта
- •Режимы преобразования координат
- •Режимы преобразования координат с постоянным масштабом
- •Режимы преобразования координат с переменным масштабом
- •Замечание
- •Координатные пространства mfc
- •Пример использования режимов преобразования координат
- •Работа с окнами, содержащими полосы прокрутки
- •Линейки прокрутки
- •Различные способы прокрутки
- •Прием ввода с клавиатуры
- •Контрольные вопросы
- •Обработка сообщений от мыши.
- •Задание для самостоятельной домашней разработки.
- •Лекция 3. Меню. Панели инструментов и строки состояния Методические рекомендации
- •Меню Windows
- •Обновление командного пользовательского интерфейса
- •Класс cMenu
- •Создание контекстных меню
- •Панели элементов управления и каркас приложений
- •Панель инструментов
- •Растровое изображение панели инструментов
- •Состояния кнопок Любая кнопка может находиться в следующих состояниях
- •Всплывающие подсказки
- •Строка состояния
- •Определение секций в строке состояния
- •Строка сообщений
- •Индикатор состояния
- •Управление строкой состояния
- •Контрольные вопросы:
- •Добавление переменных-членов.
- •Добавление функции OnMouseMove.
- •Программирование команд контекстного меню.
- •Программирование команд главного меню.
- •Домашняя работа.
- •Лекция 4. Диалоговые окна и стандартные элементы управления Методические рекомендации
- •Работа с модальным диалоговым окном
- •Стандартные элементы управления
- •Работа с немодальными диалоговыми окнами
- •Пользовательские сообщения
- •Принадлежность диалогового окна
- •Контрольные вопросы
- •Создание класса “диалогового окна”.
- •Добавление переменных-членов класса вашего диалогового окна.
- •Написание инициализирующего кода
- •Присваивание переменным начальных значений.
- •Самостоятельная работа.
- •Домашнее задание.
- •Лекция 5. Обработка сообщений Windows и программирование многопоточных приложений Методические рекомендации
- •Обработка сообщений в однопоточной программе
- •Передача управления
- •Таймеры
- •Обработка в периоды простоя
- •Программирование многопоточных приложений
- •Функция рабочего потока и запуск потока
- •Общение основного потока с рабочим
- •Общение рабочего потока с основным
- •Синхронизация потоков с использованием событий
- •Блокировка потоков
- •Критические секции
- •Потоки пользовательского интерфейса
- •Контрольные вопросы
- •Домашнее задание.
- •Задание для самостоятельной работы
- •Управление процессом Пример 1.
- •2. Замена образа процеса Пример 2. Использование функции exec.
- •Пример 3. Использование неименованного канала.
- •Пример 4. Создание именованного канал с именем "fifo".
- •3. Сигналы.
- •Пример 5. Использование сигналов.
- •Пример 6. Сообщения.
- •Пример 7. Сообщения.
- •Пример 8. Разделение памяти.
- •Пример 9. Использование семафоров.
- •Пример 10. Создание процесса вWindows.
- •Пример 11. Использование неименованного канала.
- •Пример 12. Использование именованного канала.
- •Пример 13. Использование разделяемой памяти File Mapping.
- •Пример 14. Использование Mailslot.
- •Пример 15. Использование событий.
Домашнее задание.
Модифицируйте данную программу таким образом, чтобы рабочие потоки общались с основным потоком через события по механизму, описанному в лекциях. Добавьте в каждый поток функциональность. Пусть первый поток ищет числа Фибоначи, а второй простые числа.
Задание для самостоятельной работы
В качестве самостоятельной работы предлагается студентам продемонстрировать умение использовать все системные механизы ОС Windows, перечисленные в примерах программ по теме и относящиеся к ОС Windows.
Во время сдачи работы студенту будет предложено выполнить задание на базе освоенного в лабораторной работе материала.
Управление процессом Пример 1.
Этой программе передаются два параметра - имя существующего файла и имя создаваемого файла. Процесс открывает существующий файл, создает новый файл и при условии отсутствия ошибок - порождает новый процесс.
#include <fcntl.h>
int fdrd, fdwt;
char c;
main(int argc,char *argv[])
{
if (argc != 3)
exit(1);
if ((fdrd = open(argv[1],O_RDONLY)) == -1)
exit(1);
if ((fdwt = creat(argv[2],0666)) == -1)
exit(1);
fork();
/*оба процесса исполняют одну и ту же программу*/
rdwrt();
exit(0);
}
rdwrt();
{
for(;;)
{
if (read(fdrd,&c,1) != 1)
return;
write(fdwt,&c,1);
} }
Ядро делает копию контекста родительского процесса для порожденного, при этом родительский процесс исполняется в одном адресном пространстве, а порожденный - в другом. Каждый из процессов может работать со своими собственными копиями глобальных переменных fdrd, fdwt и c, а также со своими собственными копиями стековых переменных argc и argv, но ни один из них не может обращаться к переменным другого процесса. Порожденный процесс наследует доступ к файлам родительского с правом использования тех же самых дескрипторов.
Родительский и порожденный процессы независимо друг от друга вызывают функцию rdwrt и в цикле считывают по одному байту информацию из исходного файла и переписывают ее в файл вывода. Функция rdwrt возвращает управление, когда при считывании обнаруживается конец файла. Дескрипторы fdrd в том и в другом процессах указывают на запись в таблице файлов, соответствующую исходному файлу, а дескрипторы, подставляемые в качестве fdwt, - на запись, соответствующую результирующему файлу.
Ядро не гарантирует согласование темпов выполнения процессов и последовательность их запуска.
2. Замена образа процеса Пример 2. Использование функции exec.
sc
vi file_master.c
vi file_slave1.c
vi file_slave2.c
gcc file_master.c –o file_master
gcc file_slave1.c –o file_slave1
gcc file_slave2.c –o file_slave2
file_master 5 r 3 q
file_master.c
#include <stdio.h>
main(int iArg,char* cArg[])
{
int i;
if(fork()==0)
execl(“file_slave1”,“file_slave1”,cArg[1],cArg[2],0);
if(fork()==0)
execl(“file_slave2”,“file_slave2”,cArg[3],cArg[4],0);
wait((int*)0);
}
file_slave1.c
#include <stdio.h>
main(int iArg,char* cArg[])
{
int i;
for(i=1;i<=atoi(cAarg[1];i++)
{printf(“%s\n”,cArg[2]);sleep(3);}
}
file_slave2.c
#include <stdio.h>
main(int iArg,char* cArg[])
{
int i;
for(i=1;i<=atoi(cAarg[1];i++)
{printf(“%s\n”,cArg[2]);sleep(3);}
}
Пример 3. Использование неименованного канала.
Программа передаёт и считывает из канала строку символов "hello".
#include <stdio.h>
#include <unistd.h>
char string[]=”hello”;
main()
{
int i;
char buf[10];
int fds[2];
pipe (fds);
for(i=1;i<10;i++)
{
write(fds[1],buf,6);
read(fds[0],buf,6);
}
}