반응형

프로그래밍 34

병렬 프로그래밍 Parallel Programming - concurrent_vector

이전 정리글은 2021.12.28 - [프로그래밍/Parallel Programming] - 병렬 프로그래밍 Parallel Programming - parallel_sort 오늘은 7번째 정리시간이다. 오늘은 무엇에 대해서 정리해볼까.? 오늘은 PPL 에서 제공하는 컨테이너에 대해서 정리해보자. 먼저 알아볼 것은 vector 에 대해서 알아보자. concurrency::concurrent_vector 우리가 알고 있는 STL vector 와 동일한 것이다. 하지만 차이가 있다. 병행 프로그래밍에서 사용할 수 있는 컨테이너이기에 제공하는 몇개의 함수에 대해서 thread-safe 를 보장한다. 그럼 어떤 함수들이 thread-safe 한지 알아보자. 함수 thread-safe 함수 thread-safe ..

c++ 템플릿 가변인자 Variadic template

항상 자주 마주치지만 익숙하지 않은 템플릿에 대해서 정리해보자. 템플릿에서 인자로 받을 수 있는 것은 무엇이 있을까? 일단 변수는 되지 못한다. 그리고 실수 값도 사용이 불가하다. 그렇다 템플릿 인자로 가능한 것은 정수형 상수이거나 타입일 경우에만 가능하다. 다음의 코드를 보자. template class CTemplateTest { T tName[SIZE]; }; int main() { CTemplateTest test1; CTemplateTest test2; // 정수값만 가능. CTemplateTest test3; //템플릿 인자를 명시해야 함 int value = 10; CTemplateTest test4; //변수 불가능. CTemplateTest test5; return 0; } 위 코드는 템..

Visual studio 디버그 빌드 배포시 종속 DLL 위치

테스트나 다른 어떤 이유에서 디버그 빌드를 배포하여 사용할 경우가 있다. 가장 빈번한 이유는 다른 곳에서 디버깅 필요가 있을 경우가 제일 많을 것이다. 릴리즈는 MS에서 VS 마다의 재배포 패키지를 인터넷을 통해 배포 중이기에 쉽게 설치가 가능하나 디버그 같은 경우에는 따로 제공되지 않고 있다. 이전에는 윈도우의 DLL 디렉토리에 위치해있는 것을 하나 하나 찾았는데 그럴필요 없이 VS 설치폴더에 가면 잘 정리되어 있다. 다음은 예를들어 VS2013 일 때의 경로이다. 위 이미지의 경로를 보면 Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\Debug_NonRedist 위치에 플랫폼 별로 DLL이 위치해 있다. 해당 폴더 내 DLL 을 가져다 실행파..

Perspective Projection

Perspective Projection 이란 무엇인가? Perspective Projection 이미지가 투영되는 면을 변화시키고자 할 때 사용하는 알고리즘이다. 내가 이 알고리즘을 접하게 된 것은 과거 프로젝트를 진행하면서 로봇 장치와 카메라를 가지고 사각 화면을 터치해야 하는 부분이 있었다. 알겠지만 카메라를 통해 보는 터치화면은 실체 터치화면 처럼 사각형으로 보이지 않을 경우가 있다. 그래서 클릭해야 할 좌표에 대한 보정이 필요한데 이 때 사용한 것이 이 알고리즘을 기반으로 한 것이다. 기본적으로 Perspective Transform 을 위한 수식은 다음과 같다. 저 행렬에서 1을 넣는 것은 표현식을 쉽고 구하기 편하게 하기 위함이다. 위 행렬의 의미는 일단 본 직선 방정식에 어떠한 변화를 주어..

MFC 현재 윈도우 폰트 속성

현재 윈도우의 폰트 속성을 알고 싶을 경우가 있다. 폰트 속성을 알아아내기 위해서는 다음 코드를 보자. BOOL TestDlg::OnInitDialog() { LOGFONT lf; CDialogEx::OnInitDialog(); //생략 m_bigfont.CreatePointFont(200, "굴림"); GetDlgItem(IDC_EDIT)->SetFont(&m_bigfont); GetFont()->GetLogFont(&lf); lf.lfItalic = TRUE; // 주어진 로그 폰트 속성을 이용하여 폰트를 생성한다. m_stylefont.CreateFontIndirect(&lf); GetDlgItem(IDC_EDIT)->SetFont(&m_stylefont); //생략 return TRUE; } 위 ..

MFC 다이얼로그(Dialog) 스크롤(Scroll) 적용

MFC에서 다이얼로그에 스크롤을 적용하기 위한 코드를 보도록 하자. 우선 리소스에디터에서 해당 다이얼로그의 속성 중 Border 를 Resizing 으로 수정해 놓아야 한다. 그 이후 필요한 것은 크기 변동 이벤트 시 적절한 대응과 스크롤 발생 이벤트 시 적절한 행동을 수행하는 것이다. 우선 WM_SIZE 이벤트에 대한 처리를 진행하자. void TestDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); UpdateScrollInfo(cx, cy); } void TestDlg::UpdateScrollInfo(int cx, int cy) { int nScrollMaxV = 0; int nScrollMaxH = 0; int ..

병렬 프로그래밍 Parallel Programming - parallel_sort

이전 정리글은 2021.12.26 - [프로그래밍/Parallel Programming] - 병렬 프로그래밍 Parallel Programming - parallel_invoke 자. 오늘은 병렬 방식을 이용한 정렬 함수에 대해 알아보자. 첫번째로 알아볼 함수는 parallel_sort 함수이다. 해당 함수는 std::sort 함수의 다중 프로세스 버전이라고 생각하면 될 것 같다. 자 코드를 보자구~!! #include #include #include using namespace std; int _tmain() { vector vecIntegers(100000); generate(begin(vecIntegers), end(vecIntegers), mt19937(79)); concurrency::paral..

병렬 프로그래밍 Parallel Programming - parallel_invoke

이전 정리글은 2021.12.22 - [프로그래밍/Parallel Programming] - 병렬 프로그래밍 Parallel Programming - parallel_for 메리 크리스마스. ~! 예전에는 크리스마스 때 설렘이 있었는데 나이를 먹었나보다. ㅜㅜ 자 오늘은 parallel_invoke 에 대해서 정리해보자구~ parallel_invoke 이 함수는 여러개의 작업을 동시에 실행하고자 다룰 때 유용하다. 언제나 그랬듯이 코드를 보자 ㅎ,.ㅎ #include #include #include using namespace std; template T addself(const T& p) { return p + p; } int _tmain() { int i = 12; short j = 15; doubl..

CLR

CLR managed module compile 프로그래밍 언어들은 서로 다른 기능성과 정점을 가지고 있다. unmanaged c/c++ 의 경우 낮은 수준까지 시스템을 제어할 수 있고 메모리를 어떤 방식으로 사용하고 관리할 것인지 개입할 수 있다. 이와 다르게 VB를 사용하면 사용자 인터페이스를 쉽고 빠르게 COM 제어를 간단하게 이용할 수 있게 해줄 것이다. CLR은 서로 다른 프로그래밍 언어들 사이에서 공용으로 사용하여 실행할 수 있도록 하는 환경을 의미한다. CLR은 어떤 컴파일러를 사용하든 최종 결과물은 managed module이 된다. managed module 의 각 영역에 대한 설명은 다음과 같다. PE32/ PE32+ 헤더 영역 표준 Windows PE 파일 헤더로 공용 객체 파일 형식..

프로그래밍/CLR 2021.12.24

소멸자 명시적 호출의 주의점 ?

음 메모리 풀을 구현하다 경험한 것을 정리한다. 인터넷에서 검색을 해봐도 잘 보이질 않고 물어볼 사람도 없어서 추정의 글을 적는다. 혹시라도 누군가 본 후 틀렸다면 정보를 제공하면 고마울 것 같다. 일단 코드부터 보자. template class NzOPool { public : NzOPool(int nMaxSize = 20) : m_nMaxSize(nMaxSize){ for(int i =0; i~T(); free(pObj); } } } T* Pop() { T* pRet = nullptr; if( m_queObjs.try_pop( pRet ) == false){ pRet = (T*)malloc( sizeof(T)); ++m_nMaxSize; } new (pRet) T(); //생성자 명시적 호출 retu..

반응형