Upload
tania
View
80
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Структура программы Windows для решения поставленной задачи. Меркулов Артем Магистрант первого года обучения. 1. Однопоточное приложение. Основной поток Вычисления В цикле с ожиданием сообщений При обработке сообщения WM_TIMER Визуализация Ввод/вывод данных - PowerPoint PPT Presentation
Citation preview
Структура программы 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);