VisualStudio.C++.C#/코딩팁,함수활용,단편 ( 156 ) while 대기방식에서 일정시간 응답 없는 경우 while 탈출 로직. 코드의 실행 대기 용도로 while() 문을 사용하는 경우가 있다. 예. UART RX 로 데이터 수신된것을 폴링방식으로 읽는 경우를 보면, 아래처럼 작성된다. while (RX 버퍼에 데이터가 없다면) ; // 대기. 버퍼에 데이터가 있다면 빠져나온다. 함수 RX 버퍼 읽기. // 값읽기. 위 코드의 문제점은 while 문이 무한대기에 빠져 있을 수 있다는 점이다. 송신측에서 데이터를 보낸다는 보장이 없는 경우도 있다. 위 코드에 추가로 간단한 타이머 기능을 구현하면 아래와 같다. uint32_t count=10000; // 시스템 상황에 따라 최대값을 조정한다. /// 대기상태. count 값 감소하여 0이 되어도 while탈출하고 혹은 count값이 0이 되기전에 RX버퍼에 데이터 수신되어도 탈출... 2015. 9. 1. ASCII 코드. ASCII printable code chart Binary Oct Dec Hex Glyph 010 0000 040 32 20 (space) 010 0001 041 33 21 ! 010 0010 042 34 22 " 010 0011 043 35 23 # 010 0100 044 36 24 $ 010 0101 045 37 25 % 010 0110 046 38 26 & 010 0111 047 39 27 ' 010 1000 050 40 28 ( 010 1001 051 41 29 ) 010 1010 052 42 2A * 010 1011 053 43 2B + 010 1100 054 44 2C , 010 1101 055 45 2D - 010 1110 056 46 2E . 010 1111 057 47 2F / 011 .. 2015. 9. 1. 배열 초기화. 2차원 배열 초기화 m x n 의 2차원 배열의 모든 요소(element) 를 지정된 값으로 초기화하려면 아래와 같다. 예. 2 x 3 (2행 3열) 정수형 배열이 있고, 아래 표 처럼 초기화 하고 싶다면, int Array[2][3] = {{1,2,3},{4,5,6}}; 로 초기화 하면 된다. 인덱스 0열 1열 2열 0행 1 2 3 1행 4 5 6 기타 규칙. 1. 초기화 값이 누락된 것은 0으로 초기화 됨. 예 : int Array[2][3] = {{1,2}}; 인덱스 0 1 2 0 1 2 0 1 0 0 0 2. 중괄호 1개만으로 초기화 가능. 예 : int Array[2][3] = {1,2,3,4,5,6}; // int Array[2][3] = {{1,2,3},{4,5,6}}; 와 동일함. 예 : .. 2015. 7. 7. VC++ 타이틀바에 보이는 프로그램 이름 변경. VC++ 프로젝트로 만든 프로그램 타이틀바에 보이는 이름 변경하는 법. CMainFrame 의 PreCreateWindow에 아래 파랑색 코드 추가하면됨. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style &= ~FWS_ADDTOTITLE; // 이설정을 해야 타이틀 변경 가능해짐. cs.lpszName = "내프로그램임"; return TRUE; } 대화상자의 타이틀 설정. ::OnInitDialog().. 2015. 6. 6. 다른 프로그램과 메모리 공유 - 메모리 맵 파일. 개요 다른 프로그램(프로세스)들이 동일한 메모리를 고유하는 "메모리맵파일(=공유메모리)" 활용법 정리.요점.1. ::CreateFileMapping 으로 공유메모리 생성. ::OpenFileMapping 으로 이미 생성된 공유메모리 열기.2. ::MapViewOfFile 로 상기1의 공유메모리 포인터 받아서 데이터 읽기,쓰기.더보기더보기-함수 CreateFileMapping 상세CreateFileMappingCreates or opens a named or unnamed file mapping object for a specified file.To specify the NUMA node for the physical memory, see CreateFileMappingNuma.SyntaxC++CopyHA.. 2015. 6. 6. 다른 프로그램과 메시지 송수신 - FindWindow이용 대상윈도우핸들로 직접 전송. 개요 서로 다른 프로그램간의 메시지 송수신을 위하여 메시지 전송대상 윈도우 핸들을 함수 FindWindow 이용하여 확보하고 메시지 전송하는 방법 정리. 간단히 2단계로 이뤄진다. 1. FindWindow 로 메시지 타겟 윈도우 핸들 받기. 2. 1에서 확보된 윈도우 핸들로 SendMessage/PostMessage 함수 이용 메시지 전송. 타 방법 비교 : 다른 프로그램간의 메시지 송수신 방식중 RegisterWindowsMessage 함수 이용하는 방식(보기 -> http://igotit.tistory.com/318 ) 대비 본 글에서의 설명하는 방식이 고속/즉시 전송이 가능하다. 구현코드예 메시지 전송할 프로그램을 A, 수신처리할 프로그램을 B라고 하면 각각의 프로그램엔 아래와 같은 구조로 코딩되면.. 2015. 6. 6. 다른 프로그램과 메시지 송수신. - RegisterWindowMessage 개요 보통 메시지(SendMessage, PostMessage) 는 1개의 프로그램내에서 주로 사용되나, 서로다른 프로그램간에도 메시지 송수신 가능하다. 본 글에서는 다른 프로그램간의 메시시 송수신 방법 정리한다. 구현방법 요점. 2개의 프로그램이 있다고 하고, 각각을 A, B 라고 하자. 메시지 전송함수 SendMessage/PostMessage 모두 사용가능하며 본 글에서는 SendMessage 를 예로 보이나, 설명중의 SendMessage는 PostMessage 로 대치가능하다. 1. A,B 모두에 RegisterWindowMessage 함수 호출한다. - 메시지를 등록하는 함수이며 이렇게 등록된 메시지는 다른 프로그램으로도 전달가능하다. - 함수의 인자로 임의 문자열을 기록하는데, 이 문자열이 .. 2015. 6. 5. Virtual-Key Codes. VC++ VC++ 에서 마우스나 키보드 이벤트 핸들러 함수 인자로 virtual key code 가 전달되며, 아래 리스트와 같다. Constant/value Description VK_LBUTTON 0x01 Left mouse button VK_RBUTTON 0x02 Right mouse button VK_CANCEL 0x03 Control-break processing VK_MBUTTON 0x04 Middle mouse button (three-button mouse) VK_XBUTTON1 0x05 X1 mouse button VK_XBUTTON2 0x06 X2 mouse button - 0x07 Undefined VK_BACK 0x08 BACKSPACE key VK_TAB 0x09 TAB key - 0x0A.. 2015. 1. 19. 키보드 입력처리. VC++ MFC 이용하는 경우. VC++ MFC기반의 키보드 입력처리. 1. 클래스 위저드 에서 메시지 선택을 WM_KEYDOWN(키를 누른 경우 발생하는 메시지) 이나, WM_KEYUP(눌렀던 키를 놓았을때 발생하는 메시지) 을 선택하여 핸들러 함수를 추가한다. 아래 코드예는 VC++2010 에서 CMyView 클래스에 WM_KEYDOWN 메시지 핸들러를 추가한 경우 자동 생성된 코드. void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. CView::OnKeyDown(nChar, nRepCnt, nFlags); } 2. 위 메시지 핸들러는 모든 키에서 전부 실행되는 구간이므로 특정키에서만 처.. 2015. 1. 19. 동적 메모리 할당. 변수,배열, new delete C++에서 new 이용하여 동적 메모리 할당하는 것 정리. 일반변수 동적 생성 및 제거. int* p; // int형의 포인터 변수선언. p = new int; // 동적생성함. *p = 234; // 변수사용예. . delete p; // 동적할당한 메모리 제거. p=NULL; // delete p; 는 메모리 공간을 제거했을뿐. 포인터 변수 p가 가리키는 주소는 남아있는 상태다. 이것까지 제거해둠. 1차원 배열 동적 생성 및 제거. - 250개의 정수형배열을 동적생성하는 예. int* p; // 포인터 변수 선언. p = new int[250]; // int형으로 배열크기 250 인 메모리 공간 할당했음. p[240] = 350; // 변수사용예. delete[] p; // 동적할당한 메모리 제거. .. 2015. 1. 17. 스레드 생성 방법 및 다중스레드 사용위한 필수 옵션 셋팅. VC++ 1. VC++ 에서 스레드 생성 VC++ 에서 스레드를 생성하는 방법은 5가지 방식이 있다. 1. WIN32 API 스레드 생성 함수 : CreateThread 2. C run time library 에서의 스레드 생성 함수 : _beginthreadex, _beginthread - _beginthreadex 가 _beginthread보다 많이 사용됨. - _beginthreadex 와 _beginthread 함수 내부에서는 상기1의 CreateThread 함수가 사용되고 있음. 3. C++ 클래스 형식의 스레드 생성 : 스레드 함수를 포함하는 클래스 형식으로 제작. - 상기 2의 함수를 C++에서 클래스 내에 포함시키는 형식으로 만드는 것을 의미한다. 결국 2를 클래스에서 사용하는 것을 의미함. - 스.. 2015. 1. 10. GetLastError 표현하기, 프로세스 죽이기.VC++ Retrieving the Last-Error Code When many system functions fail, they set the last-error code. If your application needs more details about an error, it can retrieve the last-error code using the GetLastError function and display a description of the error using the FormatMessage function. The following example includes an error-handling function that prints the error message and terminates the p.. 2015. 1. 10. 이전 1 ··· 6 7 8 9 다음