- •Методические рекомендации
- •План лекции
- •Интерфейс графического устройства
- •Программирование, основанное на ресурсах
- •Управления памятью
- •Документы и их представление
- •Контрольные вопросы
- •Редактирование функций.
- •Изучение работы приложения.
- •Самостоятельная работа.
- •Добавление своего класса.
- •Домашняя работа.
- •Лекция 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. Использование событий.
Пример 5. Использование сигналов.
#include <signal.h>
main()
{
extern cher();
signal(SIGINT,сher); /*при получении сигнала прерывания вызывать функцию catcher */
kill(0,SIGINT); /*послать всем процессам сигнал прерывание*/
}
cher()
{
}
Пример 6. Сообщения.
Процесс вызывает функцию msgget для того, чтобы получить дескриптор для записи с идентификатором MSGKEY. Длина сообщения принимается равной 256 байт, хотя используется только первое поле целого типа, в область текста сообщения копируется идентификатор процесса, типу сообщения присваивается значение 1, после чего вызывается функция msgsnd для посылки сообщения.
Пользовательский процесс
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define KEY 75
struct msgform {
long mtype;
char mtext[256];
};
main()
{
struct msgform msg;
int msgid,pid,*pint;
msgid = msgget(KEY,0777);
pid = getpid();
pint = (int *) msg.mtext;
*pint = pid; /* копирование идентификатора
* процесса в область текста
* сообщения */
msg.mtype = 1;
msgsnd(msgid,&msg,sizeof(int),0);
msgrcv(msgid,&msg,256,pid,0); /* идентификатор
* процесса используется в
* качестве типа сообщения */
printf("клиент: получил от процесса с pid %d\n",
*pint);
}
Пример 7. Сообщения.
Приложение клиент-сервер. Сервер выступает необходимым посредником при обращении к данным, с целью сохранения их целостности и организует их защиту от несанкционированного доступа.
Обслуживающий процесс создает сообщение путем установки флага IPC _CREAT при выполнении функции msgget и получает все сообщения (типа 1) - запросы от процессов-клиентов. Он читает текст сообщения, находит идентификатор процесса-клиента и приравнивает возвращаемое значение типа сообщения значению этого идентификатора. В данном примере обслуживающий процесс возвращает в тексте сообщения процессу-клиенту его идентификатор, и клиент получает сообщения с типом, равным идентификатору клиента. Таким образом, обслуживающий процесс получает сообщения только от клиентов, а клиент - только от обслуживающего процесса. Работа процессов реализуется в виде многоканального взаимодействия, строящегося на основе одной очереди сообщений.
master.c //
Родительский процесс
main()
{
int i;
if(fork()==0)
execl(“server.out”,“server.out”,0);
if(fork()==0)
execl(“client.out”,“client.out”,0);
wait((int*)0);
}
client.c //Клиент
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define KEY 75
struct msgbuf msg;
//struct msgbuf // Можно не описывать
// { // так как определена в sys/msg.h
// long mtype;
// char mtext[];
// }msg;
int msgid;
main()
{
int tt=49,i;
msgid=msgget(KEY,0777);
for(i=1;i<10;);
{
tt++;
strcpy(msg.mtext,”Привет серверу “);
msg.mtext[15]=(char)tt;
msg.mtype=1;
msgsnd(msgid,&msg,256,0);sleep(3);
strcpy(msg.mtext,”“);
if(msgrcv(msgid,&msg,256,2,0)>0)
{
printf(“Клиент: получил сообщение от сервера %s\n”,msg.mtext);
sleep(3);
i++;
}
}
}
server.c // Обслуживающий процесс (сервер)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#define KEY 75
struct msgbuf msg;
int msgid;
main()
{
int tt=49,i;
msgid=msgget(KEY,0777|IPC_CREAT);
for(i=1;i<10;);
{
strcpy(msg.mtext,”“);
if(msgrcv(msgid,&msg,256,1,0)>0)
{
printf(“Сервер: получил сообщение от клиента %s\n”,msg.mtext);
sleep(3);
i++;
}
tt++;
strcpy(msg.mtext,”Привет клиенту “);
msg.mtext[16]=(char)tt;
msg.mtype=2;
msgsnd(msgid,&msg,256,0);
}
msgctl(msgid,IPC_RMID,0);
}