Структура программы Windows для решения поставленной...
description
Transcript of Структура программы Windows для решения поставленной...
Структура программы Windows для решения поставленной задачи
Меркулов АртемМагистрант первого года обучения
1. Однопоточное приложение
Основной поток Вычисления
В цикле с ожиданием сообщений При обработке сообщения WM_TIMER
Визуализация Ввод/вывод данных
Считывание начальных данных из файла Передача через командную строку Статически − в программе Использование элементов управления
2. Основной поток + вычислительный поток
Основной поток Визуализация Ввод/вывод данных Синхронизация с вычислительным
потоком Ожидание завершения потока Использование семафоров
Вычислительный поток Вычисления
3. Основной поток + много вычислительных потоков
Основной поток Ввод/вывод Синхронизация с вычислительными
потоками Ожидание завершения потоков С использованием семафоров
Визуализация Вычислительный поток
Вычисления Синхронизация с другими потоками
Однопоточное приложение
С использованием таймераcase WM_CREATE:
SetTimer();break;
…case WM_TIMER:
ВычисленияВизуализацияbreak;
Нельзя точно угадать на какой интервал ставить таймер
Однопоточное приложение Вычисления в свободное времяwhile(1){
while(!PeekMessage(&msg)){ВычисленияВизуализация
}while(PeekMessage(&msg)){
if(msg.message==WM_QUIT){return;
}TranslateMessage();DispatchMessage();
}}
Основной поток + вычислительный поток
Ожидание завершения потоков
Частое порождение и завершениепотоков может повлиять напроизводительность
HANDLE Thread[M];
for(i=0;i<M;i++){
Thread[i]=CreateThread(0,0,ComputetionalThread,(void*)i,0,0);
}
i=MsgWaitForMultipleObjectsEx(M,Thread,INFINITE,QS_ALLEVENTS,MWMO_WAITALL);
Основной поток + вычислительный поток
Использование семафоров// вычислительный поток
for(time=0;time<TIME;time+=dt){
WaitForSingleObject(Mutex[i]);
…
ReleaseMutex();
}
// основной поток
HANDLE Mutex[M]; char name[100];
for(i=0;i<M;i++){ sprintf(name,”mutex_%d”,i); Mutex[i]=CreateMutex(0,true,name);
CreateThread(0,0,ComputetionalThread,(void*)i,0,0);
}
MsgWaitForMultipleObjectsEx(M,Thread,INFINITE,QS_ALLEVENTS,MWMO_WAITALL);
Синхронизация между вычислительными потоками
N=M*K N частиц M потоков K частиц в одном потоке
Синхронизация нужна при вычислении силы.
Синхронизация между вычислительными потоками 1. С использованием критического интервала
// Основной потокInitializeCriticalSection();
// Выислительные потокиEnterCriticalSection();
ВычисленияLeaveCriticalSection();
Практически последовательный вариант
Синхронизация между вычислительными потоками 2. С использованием семафоров//Основной потокfor(i=0;i<M;i++){Mutex[i]=CreateMutex(); Mutex2[i]=CreateMutex();}Mutex3=CreateMutex(Mutex3);// Вычислительные потокиfor(i=0;i<M;i++){Mutex[i]=OpenMutex(); Mutex2[i]=OpenMutex();}Mutex3=OpenMutex();for(i=0;i<M;i++){WaitForSingleObject(Mutex3)
j=WaitForMultipleObjects(Mutex);WaitForMultipleObjects(Mutex2[MyNumber]);
ReleaseMutex(Mutex3);Производим вычисления с использованием частиц j-го потокаReleaseMutex(Mutex[j]); ReleaseMutex(Mutex2[MyNumber]);
}
Графические средства
GDI – graphic device interface Используется в Windows для
изображения 2D графики OpenGL – open graphic library
Кросс платформенная графическая библиотека для изображения 2D и 3D графики
GDI
Преобразование координат Перенос Масштабирование Поворот Искривление
Логическое преобразование Задание единиц измерения
y
x
y
x
1)
2)
Окно
Экран
Система координат модели
Перенос
Масштабирование
Поворот
Искривление
Преобразование координат Вручную
Пересчет координат по формулам С помощью средств GDI
SetWorldTransform(HDC,XFORM*);XFORM{
FLOAT eM11; FLOAT eM12; FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy;
};
Типы преобразования координат
Operation eM11 eM12 eM21 eM22
Поворот на угол a
cos(a) sin(a) -sin(a) cos(a)
Масштабирование
Масштаб по оси X
0 0 Масштаб по оси Y
Искривление
1 Смещение вдоль оси X
Смещение вдоль оси Y
1
Отражение ±1 0 0 ±1
eDx, eDy – сдвиг по осям X и Y соответственно.
Логическое преобразование
Dx = ((Lx - WOx) * VEx / WEx) + VOx
Dx x value in device units Lx x value in logical units WOx window x origin VOx viewport x origin WEx window x-extent VEx viewport x-extent
Логическое преобразование
BOOL SetWindowExtEx(hdc,WEx,WEy,pSize);BOOL SetWindowExtEx(hdc,VEx,VEy,pSize);BOOL SetWindowOrgEx(hdc,WOx,WOy,pPoint);BOOL SetViewportOrgEx(hdc,VOx,VOy,pPoint);
SetMapMode(hdc,MM_ANISOTROPIC);