전체 글 389

WaitForSingleObject의 첫 인수가 스레드 핸들인 경우 유의점

첫 인수가 스레드 핸들일 경우, 스레드가 종료하거나 두번째 인수인 time-out 시간에 도달하면 리턴하게 된다. 그런데 조금 유의할 게 둘이상의 스레드가 대기하는 경우... 타겟 스레드 종료시점이나 타임아웃 시점에 대기순서대로의 실행을 보장해주지 못한다. 이를 테면 WaitForSingleObject(h타겟스레드, 타임아웃); 이런 대기코드가 존재하고 대기 스레드 1이 먼저 대기상태에 들어가고 이후 대기 스레드 2가 대기상태에 들어가고 조금 있다가 대기 스레드 3이 대기상태에 들어간 후 타겟 스레드가 실행이 종료되면 대기상태에 가장 먼저 들어간 스레드 1이 먼저 실행되진 않는다. 대기 스레드 1, 대기 스레드 2, 대기 스레드 3 이런 순으로 항상 실행되지 않는다. 여러 번 테스트해 봤는데 거의 무작위..

API 2012.03.17

가변인수 활용하기

가변인수는 ...으로 표시하고 이를 받기 위해서는 따로 매크로 va_ 로 시작되는 매크로들을 사용해야 한다. 이를 이용하면 따로 입맛에 맛는 함수를 만들 수 있다. 가령 에디트 콘트롤에 문자열을 입력하고자 할때 보통 char szText[256]; wsprintfA(szText, "%d, %s\r\n", 정수, 문자열); SetWindowTextA(hEdit, szText); 이렇게 3줄이나 걸리는데,,,, 가변 인수를 직접 사용자 정의 함수에서 조작하면 PrintOnEdit(HWND hWnd, char *lpFmt, ...) 식으로 한 줄로 깔끔하게 처리할 수 있게 된다. 활용도가 좋다. 아래는 로그 에디트에 출력하는 예. int LogText(LPCSTR lpFmt, ...) // stdcall로 선..

C, C++ 문법 2012.03.06

뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부

WAIT_ABANDONED 이 리턴값은 WaitForSingleObject 기타 등등 대기 함수에서 동기화 객체를 소유한 스레드가 terminate되거나 exit 된 경우 발생하게 된다. 크리티컬 섹션 같은 동일 프로세스 내에서만 통용되는 동기화 함수는 이런 기능?을 제공하지 않으므로 소유 스레드가 락 상태가 되면 나머지 기다리는 스레드들은 무한정 대기해버리는 문제가 발생한다. 뮤텍스는 저 기능 하나만으로도 그 동안 매우 유용하게 프로세스 간이나 스레드 간에 잘 사용했다. 그런데 카운트 제한 때문에 세마포어를 사용할 일이 있어서 테스트해보았는데 뮤텍스처럼 불측의 종료시 WAIT_ABANDONED 결과값이 발생하지 않았다. 뮤텍스처럼 이름을 붙이는 것도 가능하고 프로세스 간에도 전역적으로 통용되니 비슷할 ..

API 2012.03.06

대소문자 구별 없이 소스 문자열에서 특정 문자열 찾기

#if defined(UNICODE) || defined(_UNICODE) #define_tcsistr wcsistr #else #define_tcsistr stristr #endif char * __stdcall stristr(const char *src, const char *fnd) { const char *p, *q; char a, b; for (; ; ++src) { for (p = src, q = fnd; *q; ++p, ++q)// 빠른 실행 위해 *p 조건은 넣지 않는다. 안의 문자 불일치 조건으로 처리된다. { if (*p = 'A') {a = *p + 0x20;} else {a = *p;}// 'A' 이상인 경우가 훨씬 많으므로 'Z' 이하 조건을 앞에 두는게 효율적이다. if (*q ..

C, C++ 문법 2012.03.05

문자열 입력시 헥스 문자열을 통해 헥스 값을 그대로 입력시키고자 할 때 알아두면 좋은 tip!

우연히 웹에서 검색하다 소스에서 발견한 건데,,, \x를 붙이면 뒤의 헥스 형식의 문자 둘은 그대로 헥스값으로 입력된다. x는 반드시 소문자여야만 하는 것 같다. 가령 아래와 같은 경우는 모두 김치가 들어간다. //char szText[] = "김치"; //char szText[] = {0XB1, 0XE8, 0XC4, 0XA1, 0}; // 이 경우 메모리의 리소스 섹션에 스트링은 존재하지 않을 것이다. char szText[] = "\xB1\xE8\xC4\xA1\x00";

C, C++ 문법 2012.03.01

COM+ 및 이를 활용하여 블로그 구축 관련 pdf 자료

절판된 책인데 내용이 언뜻 봐도 알찬 듯 하네요. COM 관련 개념설명도 좋은 것 같습니다. Appendix A 예제 프로그램 설치하기.pdf Chapter 1 커스텀 웹 컨트롤 프로그래밍.pdf Chapter 2 XML과 XSLT 프로그래밍.pdf Chapter 3 COM+ 프로그래밍.pdf Chapter 4 실전예제 - 블로그 시스템 구현하기.pdf 고맙게도 저작자분께서 비영리 목적으로 배포나 이용을 허락하셨네요. 이에 대한 pdf 전문 내용입니다. 이 문서는 2004년 10월 가남사에서 출간된 iASP.Net으로 구현하는 블로그 프로그래밍i 서적의 원고이며 책이 절판된 이후 더러 찾으시는 분이 있어 PDF 형태로 공개합니다. 이 저작물의 저작권은 저자인 i장현희i에게 있으며 이 저작물의 내용은 i크..

COM, ATL 2011.07.26

헥스 문자열과 값의 상호 변환

/** @author nameless @brief 값을 헥스 문자열로 변환한다. 1바이트당 문자 2개로 표현한다. 예를 들어 0의 경우에 "0"이 아닌 "00"으로 변환한다. */ unsigned int __stdcall ValToHexStrA(char *pszDestStr, const void *pSrcVal, unsigned int cbSize) { unsigned int len; len = cbSize > 4; // 상위 4비트(128 이상인 값의 연산 대비 unsigned 형으로 캐스팅) if (*pszDestStr >= 0 && *pszDestStr = 0 && *pszDestStr = '0' && *pszHexStr

C, C++ 문법 2011.07.25

비트 연산으로 산술연산 빠르게 처리하기

> n 은 2를 n번 나눈 것이고 위의 것들은 익히 잘 알려져 있고 꽤 쓰이는 듯 하다. 다음으로 2의 n제곱 단위의 수를 나눈 나머지 연산의 경우도 앤드 연산으로 가능하다. i % 2 => i & 1 i % 4 => i & 3 i % 8 => i & 7 i % 16 => i & 15 i % 32 => i & 31 .... i % 2의 n제곱 => i & (2의 n제곱 - 1) 나머지 연산보다는 비트 연산이 비할바 없이 빠르다. 참고로 릴리즈 실행 화일을 올리디버거 사용하여 어셈블리 코드를 뜯어보니 역시나 컴파일러가 저 경우 앤드 연산으로 알아서 최적화 코드를 생성함을 알 수 있었다. 다음으로 xor 연산으로 특정한 경우 뺄셈처리가 가능하다. 가령 32개의 요소가 있는 경우 0 ~ 31까지 인덱스를 역순..

C, C++ 문법 2011.07.24

프로세스, 스레드간의 상호 통신에 주의해야 될 점

어떤 프로그램을 만들어서 타겟 프로그램을 조종한 적이 있는데, 이게 심심찮게 먹통이 되는 것이다. 이것저것 테스트해보니 타겟프로그램에 먹통이 생긴 경우 조종 프로그램도 같이 먹통이 되는 것이었다. 조사해보니 SendMessage와 같이 타겟프로그램에서 결과값을 보내 줄 때까지 대기하는 동기적인 함수가 문제였다. 타겟 프로그램이 먹통이 되버리니 처리가 안되어 결과값을 보내지 못하고 따라서 조종 프로그램도 계속 멍청히 대기하는 것이다. 그래서 결과값이 필요 없는 행동의 경우 PostMessage를 사용하고 (PostMessage는 타겟 윈도우를 소유한 스레드의 메시지 큐에 메시지를 넣고 바로 리턴한다.) 결과값이 필요한 경우는 SendMessageTimeout API를 사용하는 게 좋다. 이 함수는 일정시간..

API 2011.07.21