220 likes | 422 Views
Структура программы Windows для решения поставленной задачи. Меркулов Артем Магистрант первого года обучения. 1. Однопоточное приложение . Основной поток Вычисления В цикле с ожиданием сообщений При обработке сообщения WM_TIMER Визуализация Ввод/вывод данных
E N D
Структура программы 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 • Преобразование координат • Перенос • Масштабирование • Поворот • Искривление • Логическое преобразование • Задание единиц измерения
1) 2) y y Система координат модели x x Окно Экран
Преобразование координат • Вручную • Пересчет координат по формулам • С помощью средств GDI • SetWorldTransform(HDC,XFORM*); XFORM { FLOAT eM11; FLOAT eM12; FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy; };
Логическое преобразование 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);