[Semaphore]

Development/C/C++ 2011. 12. 1. 20:18

Semaphore

Mutex와 상당히 유사하다. 물론 Mutex와 비교해서 Semaphore는 다른 특징도 지니고 있다.

Semaphore 함수
1. Semaphore 생성 함수
HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES     lpSemaphoreAttributes, //보안 속성
LONG       lInitialCount,            // Semaphore의 생성 시 초기값 설정

LONG       lMaximumCount,     // Semaphore가 지닐 수 있는 최대 카운트 값을 결정

LPCTSTR  lpName                  // 생성되는 Semaphore에 이름을 줄 경우 사용

) ;

 

[ 세마포어의 경우, 카운트가 0인 경우 : non-signaled 상태, 0보다 큰 경우 : signaled 상태 ]

2. Semaphore 반환 함수
BOOL   ReleaseSemaphore (

HANDLE     hSemaphore,         // 반환하고자 하는 Semaphore 핸들

LONG         lReleaseCount,      // 증가시킬 크기 (일반적으로 1을 전달)

LPLONG     lpPreviousCount     // 변경되기 전의 카운트 값을 저장할 변수의 포인터를 전달
) ;

[ 반환한다는 것은 Semaphore의 카운트를 증가시킨다는 것을 의미 ]

'Development > C/C++' 카테고리의 다른 글

[Call by Value와 Call by Reference]  (1) 2012.05.05
[Event]  (0) 2011.12.01
[Mutex]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
Posted by cyj4369
,

[Mutex]

Development/C/C++ 2011. 12. 1. 20:04

Mutex (Mutual Exclusion)

CRITICAL_SECTIOn 오브젝트 이용한 방법과 상당히 유사하다. 따라서 Mutex 또한 열쇠라고 생각하고 이해하기 바란다.

 

Mutex 오브젝트 함수
1. Mutex 오브젝트를 생성하는 함수 
HANDLE CreateMutex ( 

LPSECURITY_ATTRIBUTES    lpMutexAttributes,      // 생성된 핸들을 자식 프로세스가 상속 받도록 할 것인가에 대한 설정

BOOL      bInitialOwner,  // TRUE 전달시, 생성된 Mutex의 소유자가 함수를 호출한 쓰레드로 초기화

                                    // FALSE 전달시, Mutex의 소유자가 존재하지 않음

LPCTSTR lpName      // 생성되는 Mutex에 이름을 줄 경우 사용되는 인자 
) ; 

2. 임계 영역에 들어가기 위해 Mutex를 얻는 함수

WaitForSingleObject 함수가 Mutex를 소유하는 역할을 한다.

(이 함수는 커널 오브젝트가 non-signaled 상태에서 signaled 상태가 되기를 기다리는 함수이다.

  타임 아웃을 설정하여 무한 대기 상태에 빠지는 것을 막을 수도 있다.)
 

3. 임계 영역을 나갈 때 Mutex를 반환하는 함수

BOOL ReleaseMutex ( HANDLE hMutex ) ;        // 반환하고자 하는 Mutex를 인자로 전달

 
4. Mutex를 소멸하는 함수

BOOL CloseHandle ( HANDLE  hObject ) ;         // 소멸하고자 하는 커널 오브젝트의 핸들을 전달

Mutex 오브젝트 소유자가 존재하는 경우 non-signaled 상태, 소유자가 존재하지 않는 경우 signal 상태가 된다.

 

 
 

'Development > C/C++' 카테고리의 다른 글

[Event]  (0) 2011.12.01
[Semaphore]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
[Mutex Thread 동기화 예제]  (0) 2011.11.30
Posted by cyj4369
,

InitializeCriticalSection()

 

하나의  공통 데이터(변수나 기타 등등) 를 특정 thread가 사용중이라면

다른 Thread들이 접근하지 못하도록 EnterCriticalSection() 로 락을 겁니다.

 

그때 그 CriticalSection, 임계영역이라고 합니다. 

그 영역을 초기화 해주는 부분입니다.

 

CriticalSection은  Multi Thread에서 가장 일반적으로 사용되는 방법이랍니다.

Multi Thread 에서 동기화하는 방법으로는 CriticalSection, Mutex, Semaphore 방법이 있습니다.

 

Win32에서의 임계영역

Win32에 대한 코드는 모두 C++를 사용했다. Win32에서의 임계영역은 다음과 같은 순서로 한다

-------------------------------------------------------------

//임계영역을 선언한다.
CRITICAL_SECTION cs;

//임계영역을 초기화 한다.
InitializeCriticalSection(&cs);

//임계영역으로 들어간다. 여기서는 한 번에 하나의 Thread만
//임계영역에 들어갈 수 있으며, 이미 임계영역에 들어간 
//Thread가 있으면 다른 Thread는 여기서 대기한다.


EnterCriticalSection(&cs);
try {

     // 한번에 하나의 Thread에 의해서만 실행될 수 있는 블럭이다.

}
finally {
     LeaveCriticalSection(&cs); //임계영역을 빠져나온다.
}
      DeleteCriticalSection(&cs); //임계영역을 정리한다.

'Development > C/C++' 카테고리의 다른 글

[Semaphore]  (0) 2011.12.01
[Mutex]  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
[Mutex Thread 동기화 예제]  (0) 2011.11.30
[Sleep함수]  (0) 2011.11.29
Posted by cyj4369
,

*유니코드기반의함수

SBCS 함수

WBCS 기반의 문자열 조작 함수

strlen

size_t wcslen(const wchar_t* string);

Strcpy

wchar_t* wcscpy(wchar_t* dest,const wcahr_t* src)

strncpy

wchar_t* wcsncpy(wchar_t* dest,const wchar_t* src, size_t cnt)

strcat

wchar_t* wcscat(wchar_t* dest,const wchar_t* src)

strncat

wchar_t* wcsncat(wchar_t* dest,const wchar_t* src,size_t cnt)

strcmp

int wcscmp(const wchar_t* s1,const wchar_t* s2)

Strncmp

int wcsncmp(const wchar_t* s1,const wchar_t* s2, size_t cnt)

* 문자열 입출력 함수

SBCS 함수

WBCS 기반의 문자열 입출력 함수

printf

int wprintf(const wchar_t* format [,argument]..);

scanf

int wscanf(const wchar_t* format [,argument]..);

fgets

wchar_t* fgetws (wchar_t* string,int n,

fputs

int fputws (const wchar_t* string,FILE* stream);

* 참고

_wsetlocale(LC_ALL,L"korean"); // #include<locale.h>

=> 유니코드기반으로한글을출력하고싶을사용한다.

=> 함수는나라지역에대한정보를설정하는사용되는함수다.

*tchar.h 헤더파일을참고.

===================================================== 2 ========================================================================

*GetLastError()함수

=> 에러코드를 반환해 준다.

============================================5 장 =============================================================

*GetCurrentDirectory() 함수

원형

DWORD WINAPI GetCurrentDirectory( __in DWORD nBufferLength, __out LPTSTR lpBuffer);

- 인자 값으로 버퍼의 길이와 버퍼의 주소를 넘겨 준다.

*SetCurrentDirecotry() 함수

원형

BOOL WINAPI SetCurrentDirectory( __in LPCTSTR lpPathName);

- 인자 값으로 경로를 세팅해준다. 주소 값.

*CreateProcess() 함수

원형

BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);

원본 위치 <http://msdn.microsoft.com/en-us/library/ms682425%28v=VS.85%29.aspx>

- 인자 값은 5장 CreateProcess판을 참고할 것!!!

*ZeroMemory() 함수

원형

void ZeroMemory( [in] PVOID Destination, [in] SIZE_T Length);

-> PVOID == void*

-> ULONG_PTR == SIZE_T, *PSIZE_T;

=========================================6 장 ================================================

*SetPriorityClass() 함수

- 커널 오브젝트에 저장된 프로세스 우선순위를 높인다.

원형

BOOL WINAPI SetPriorityClass( __in HANDLE hProcess, __in DWORD dwPriorityClass);

- 핸들 값과 , 높일 우선순위가 넘어간다.

*GetCurrentProcess() 함수

- 현재 프로세스의 핸들 정보가 반환 된다.

원형

HANDLE WINAPI GetCurrentProcess(void);

*CloseHandle() 함수

- 핸들 테이블의 핸들을 제거 해주고 커널 오브젝트의 UC를 줄여준다.

원형

BOOL WINAPI CloseHandle( __in HANDLE hObject);

*TerminateProcess() 함수

- 강제로 종료를 요청하는 함수

- 되도록이면 안 쓰는 것이 좋다.

원형

BOOL WINAPI TerminateProcess( __in HANDLE hProcess, __in UINT uExitCode);

================================================7 장 =================================================

*CreateMailslot() 함수

- 메일 슬롯 생성.

원형

HANDLE WINAPI CreateMailslot(

__in LPCTSTR lpName,

__in DWORD nMaxMessageSize,

__in DWORD lReadTimeout,

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

-> lpName: 생성하는 메일슬롯의 이름을 결정

-> nMaxMessageSize: 메일슬롯의 버퍼 크기를 지정. 0이 전달되면 시스템이 허용하는 최대 크기로 지정.

-> lReadTimeout: 메일슬롯을 통해 전송된 데이터를 읽기 위해서 파일 입출력 함수인 ReadFile 함수가 사용되는데 메일 슬롯이 비어 있다면 데이터가 채워질 때 까지 blocking을 하게 되

데 최대 블로킹 시간을 정해준다. MAILSLOT_WAIT_FOREVER를 인자로 전달하면 무한 블로킹. 0 일 경우 그냥 빠져 나옴.

-> lpSecurityAttributes: 핸들을 상속하기 위한 용도.

*WaitForSingleObject() 함수

- 커널 오브젝트의 상태를 확인할 수 있음.

- Signaled 상태가 되었을 때 반환된다.

- 뮤텍스를 얻을 때에도 쓴다.

원형

DWORD WINAPI WaitForSingleObject(

__in HANDLE hHandle,

__in DWORD dwMilliseconds

);

- hHandle : 커널 오브젝트의 핸들 전달

- dwMilliseconds : 대기 시간 설정. INFINITE를 인자로 전달하면, 무한정 기다림.

- 반환 값 [표]

Return code/value

Description

WAIT_ABANDONED

0x00000080L

정상적이지못한오류발생에의해서반환

WAIT_OBJECT_0

0x00000000L

시그널상태였을반환

WAIT_TIMEOUT

0x00000102L

시간초과

WAIT_FAILED

(DWORD)0xFFFFFFFF

The function has failed. To get extended error information, call GetLastError.

* WaitForMultipleObjects() 함수

원형

DWORD WINAPI WaitForMultipleObjects(

__in DWORD nCount, //배열에 저장된 핸들 개수

__in const HANDLE *lpHandles, // 핸들을 저장하고 있는 배열의 주소

__in BOOL bWaitAll, // 모두 Signaled 상태가 되기(TRUE)를 기다리고자 하는지, 아니면 하나라도 Signaled 상태 반환(FALSE)인지 결정

__in DWORD dwMilliseconds //대기 시간.

);

=> 커널 오브젝트가 둘 이상이고, 핸들이 배열로 묶여 있을 때 가능.

*GetExitCodeProcess() 함수

- 종료 코드를 가져오는 함수.

원형

BOOL WINAPI GetExitCodeProcess(

__in HANDLE hProcess,

__out LPDWORD lpExitCode

);

========================================= 8 장 ===========================================================

*GetCurrentProcess() 함수

- 현재 프로세스의 가짜 핸들을 반환

원형

HANDLE WINAPI GetCurrentProcess(void);

*DuplicateHandle() 함수

- 핸들을 복제 함

원형

BOOL WINAPI DuplicateHandle(

__in HANDLE hSourceProcessHandle, // 복제할 핸들을 소유한 프로세스

__in HANDLE hSourceHandle, // 복제할 핸들

__in HANDLE hTargetProcessHandle, // 복제된 핸들을 소유할 프로세스

__out LPHANDLE lpTargetHandle, // 복제된 핸들 값을 저장할 변수의 주소!!

__in DWORD dwDesiredAccess, // 걍 null

__in BOOL bInheritHandle, //상속 여부

__in DWORD dwOptions //옵션.

);

*CreatePipe() 함수

- 이름 없는 파이프를 생성해주는 함수

- 두 개의 핸들을 얻게 됨.

원형

BOOL WINAPI CreatePipe(

__out PHANDLE hReadPipe, //읽는 핸들

__out PHANDLE hWritePipe, //쓰는 핸들

__in_opt LPSECURITY_ATTRIBUTES lpPipeAttributes,

__in DWORD nSize

);

*CreateNamedPipe() 함수

- 이름 있는 파이프를 생성해주는 함수

- 이름있는 파이프를 만듬.

원형

HANDLE WINAPI CreateNamedPipe(

__in LPCTSTR lpName, // 파이프 이름 지정. 형식: \\.\pipe\pipename

__in DWORD dwOpenMode, //파이프 읽기 또는 쓰기 모드 설정.

__in DWORD dwPipeMode, // 모드 설정.( 데이터 전송 타입, 데이터 수신 타입, 블로킹 모드. 3가지 설정)

__in DWORD nMaxInstances, // 파이프의 최대 개수

__in DWORD nOutBufferSize, // 파이프의 출력 버퍼 사이즈

__in DWORD nInBufferSize, // 입력 버퍼 사이즈

__in DWORD nDefaultTimeOut, // 만료 시간

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes //보안 속성.

);

*dwPipeMode에 대한 추가 설명

데이터 전송 방식

PIPE_TYPE_BYTE(바이트), PIPE_TYPE_MESSAGE(메시지) : 바이너리 형태로 전송할 것인지 메시지 방식으로 전송할 것 인지 선택

데이터 수신 방식

PIPE_READMODE_BYTE(바이트), PIPE_TYPE_MESSAGE(메시지) : 바이너리 방식(바이트 스트림)으로 읽을 지 메시지 방식으로 읽을지

함수 리턴 방식

PIPE_WAIT(블로킹), PIPE_NOWAIT(넌-블로킹) :무조건 PIPE_WAIT을 전달.

*ConnectNamePipe() 함수

파이프를 연결 요청 대기 상태로 변경시킬 때 사용하는 함수.

원형

BOOL WINAPI ConnectNamedPipe(

__in HANDLE hNamedPipe,

__inout_opt LPOVERLAPPED lpOverlapped

);

*WaitNamedPipe() 함수

- 서버의 대기 시간에 따라 클라이언트를 대기하게 끔 만들어 줌

원형

BOOL WINAPI WaitNamedPipe(

__in LPCTSTR lpNamedPipeName, //파이프 이름

__in DWORD nTimeOut // 대기 시간

);

*SetNamedPipeHandleState() 함수

- 파이프의 모드를 변경시켜준다.

원형

BOOL WINAPI SetNamedPipeHandleState(

__in HANDLE hNamedPipe, //파이프 이름

__in_opt LPDWORD lpMode, //읽기 모드와 함수 리턴방식에 대한 값을 전달.

__in_opt LPDWORD lpMaxCollectionCount, //버퍼링할 수 있는 바이트 크기

__in_opt LPDWORD lpCollectDataTimeout // 버퍼링을 허용하는 최대 시간. 클라이언트와 서버가 같은 PC 상에서 동작한다면 반드시 NULL을 전달해야 한다.

);

*FlushFileBuffers() 함수

- 파일 버퍼를 비우는 역할. 비우면서 전송하는 것?

원형

BOOL WINAPI FlushFileBuffers(

__in HANDLE hFile

);

*DisconnectNamedPipe() 함수

- 클라이언트가 에러 메시지를 받을 수 있도록 도와준다.

원형

BOOL WINAPI DisconnectNamedPipe(

__in HANDLE hNamedPipe

);

*SetEnvironmentVariable() 함수

- 환경변수에 등록한다.

원형

BOOL WINAPI SetEnvironmentVariable(

__in LPCTSTR lpName, //Key

__in_opt LPCTSTR lpValue //value

);

*GetEnvironmentVariable() 함수

- 환경 변수를 key를 통해 value 값을 가지고 와서 버퍼에 저장한다.

원형

DWORD WINAPI GetEnvironmentVariable(

__in_opt LPCTSTR lpName, //key

__out_opt LPTSTR lpBuffer, // value가 담길 버퍼

__in DWORD nSize // 버퍼 사이즈

);

===================================12 장 =========================================

*CreateThread() 함수

- 쓰레드를 생성해주는 함수

원형

HANDLE WINAPI CreateThread(

__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, //핸들의 상속여부를 결정.

__in SIZE_T dwStackSize, //스택 사이즈

__in LPTHREAD_START_ROUTINE lpStartAddress, //함수 포인터

__in_opt LPVOID lpParameter, //함수 전달 인자

__in DWORD dwCreationFlags,

__out_opt LPDWORD lpThreadId //쓰레드 식별자

);

*GetExitCodeThread() 함수

- 쓰레드 종료 시 반환 되는 값을 얻을 수 있다.

원형

BOOL WINAPI GetExitCodeThread(

__in HANDLE hThread,

__out LPDWORD lpExitCode

);

*ExitThread() 함수

- 특정 위치에서 쓰레드의 실행을 종료

원형

VOID WINAPI ExitThread(

__in DWORD dwExitCode

);

- 커널 오브젝트에 등록되는 쓰레드 종료코드를 지정.

*TerminateThread() 함수

- 외부에서 쓰레드를 종료

원형

BOOL WINAPI TerminateThread(

__inout HANDLE hThread,

__in DWORD dwExitCode

);

*_beginthreadex() 함수

- 임계영역에 접근 문제를 해결 하기 위해 독립된 메모리를 할당해준다.

원형

uintptr_t _beginthreadex(

void *security,

unsigned stack_size,

unsigned ( *start_address )( void * ),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

*_endthreadex() 함수

- 쓰레드에 할당된 메모리 블록을 해제하는 역할

원형

void _endthreadex(

unsigned retval

);

*SuspendThread() 함수

- Running 상태의 Thread를 Blocked 상태로 만들어 준다

- suspend count를 증가시키는 역할.

원형

DWORD WINAPI SuspendThread(

__in HANDLE hThread

);

*ResumeThread() 함수

- Blocked 상태의 Thread를 Ready 상태로 만들어 준다.

- suspend count를 감소시키는 역할

원형

DWORD WINAPI ResumeThread(

__in HANDLE hThread

);

*SetThreadPriority() 함수

- 쓰레드의 우선순위 세팅

원형

BOOL WINAPI SetThreadPriority(

__in HANDLE hThread,

__in int nPriority

);

- 우선순위는 참고할 것.

*GetThreadPriority() 함수

- 쓰레드의 우선순위를 가져오는 함수

원형

int WINAPI GetThreadPriority(

__in HANDLE hThread

);

============================================ 13 장 ==================================================

*InitializeCriticalSection() 함수

- 크리티컬 섹션 오브젝트를 초기화 해주는 함수

원형

void WINAPI InitializeCriticalSection(

__out LPCRITICAL_SECTION lpCriticalSection

);

*EnterCriticalSection() 함수

- 임계영역에 접근 하기 위해서 크리티컬 섹션 오브젝트를 획득하는 함수

원형

void WINAPI EnterCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

*LeaveCriticalSection() 함수

- 임계영역을 빠져 나와서 크리티컬 섹션 오브젝트를 반환하는 함수

원형

void WINAPI LeaveCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

*DeleteCriticalSection() 함수

- 크리티컬 섹션 오브젝트의 리소스를 반환 해주는 함수,

원형

void WINAPI DeleteCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

-------- 위에는 크리티컬 기반의 동기화에 사용 되는 함수들 --------------

* InterlockedIncrement() 함수

- 임계영역의 값을 동기화 시키고 +1 시켜주는 함수.

원형

LONG __cdecl InterlockedIncrement(

__inout LONG volatile *Addend

);

*InterlockedDecrement() 함수

- 임계영역의 값을 동기화 시키고 -1 시켜주는 함수.

원형

LONG __cdecl InterlockedDecrement(

__inout LONG volatile *Addend

);

------- 위에는 인터락 함수를 이용한 동기화에 사용되는 함수들 -----------------------

*CreateMutex() 함수

- 뮤텍스의 커널 오브젝트의 핸들 값을 반환 한다.

원형

HANDLE WINAPI CreateMutex(

__in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,

__in BOOL bInitialOwner,

__in_opt LPCTSTR lpName

);

*ReleaseMutex() 함수

- 뮤텍스를 Signaled 상태로 만들어 주는 함수

원형

BOOL WINAPI ReleaseMutex(

__in HANDLE hMutex

);

*OpenMutex() 함수

- 이름있는 뮤텍스의 핸들을 가져 온다.

원형

HANDLE WINAPI OpenMutex(

__in DWORD dwDesiredAccess, //뮤텍스로의 접근권한을 지정.

__in BOOL bInheritHandle, // 핸들 상속.

__in LPCTSTR lpName //뮤텍스의 이름.

);

========================================== 14 장 =========================================================

*CreateEvent() 함수

- 이벤트 오브젝트를 생성하는데 사용 되는 함수.

원형

HANDLE WINAPI CreateEvent(

__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,

__in BOOL bManualReset, // 수동 리셋(TRUE), 자동리셋(FALSE)

__in BOOL bInitialState, //signaled=TRUE, non-signaled=FALSE

__in_opt LPCTSTR lpName

);

*ResetEvent() 함수

- 수동으로 이벤트 오브젝트를 non-signaled로 바꿔 줄 때 사용

원형

BOOL WINAPI ResetEvent(

__in HANDLE hEvent

);

*SetEvent() 함수

- 이벤트 오브젝트를 signaled 상태로 바꿔 줄 때 사용.

원형

BOOL WINAPI SetEvent(

__in HANDLE hEvent

);

*CreateWaitableTimer() 함수

- 타이머 오브젝트를 생성해주는 함수.

- 타이머 오브젝트는 무조건 non-signaled 상태로 생성된다.

원형

HANDLE WINAPI CreateWaitableTimer(

__in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,

__in BOOL bManualReset,

__in_opt LPCTSTR lpTimerName

);

*SetWaitableTimer() 함수

- signaled로 바꿀 타이머 설정하는 함수.

원형

BOOL WINAPI SetWaitableTimer(

__in HANDLE hTimer,

__in const LARGE_INTEGER *pDueTime,

__in LONG lPeriod,

__in_opt PTIMERAPCROUTINE pfnCompletionRoutine,

__in_opt LPVOID lpArgToCompletionRoutine,

__in BOOL fResume

);

===================================== 17 장 ========================================

*RaiseException() 함수

- 소프트웨어 예외를 발생시키는 역할.

원형

void WINAPI RaiseException(

__in DWORD dwExceptionCode, // 발생시킬 예외의 형태를 지정

__in DWORD dwExceptionFlags, // 예외발생 이후의 실행방식에 있어서 제한을 둘 때 사용한다.

__in DWORD nNumberOfArguments, // 추가정보의 개수를 지정한다.

__in const ULONG_PTR *lpArguments // 추가정보를 전달한다.

);

1. dwExceptionCode에 대한 설명

=> dwExeptionCode에서 bit 단위 별 의미.

=> C: 커스텀 or Microsoft

=> R: Reserved

=> Sev: 심각 정도. 이건 표 참고(p571)

=> Code: Exception Code를 의미

2. dwExecptionFlags에 대한 설명

- EXEPTION_CONTINUE_EXECUTION을 넘겨 주면 EXECTION_CONTINUEW_EXECUTION의 예외처리 흐름을 막는 용도로 사용된다.

======================================== 18 장 ======================================

* CreateFile() 함수

- 파일을 생성하거나 열 때 핸들 값을 얻어오는 함수.

원형

HANDLE WINAPI CreateFile(

__in LPCTSTR lpFileName, //파일 이름.

__in DWORD dwDesiredAccess, // 읽기/쓰기 모드.

__in DWORD dwShareMode, // 파일 공유 방식 지정.

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성.

__in DWORD dwCreationDisposition, // 파일이 생성 되는 방법.

__in DWORD dwFlagsAndAttributes, // 파일의 특성 정보를 설정.

__in_opt HANDLE hTemplateFile // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용.

);

-> 기타 속성 값은 MSDN을 참고 할 것.

*ReadFile() 함수

- 파일에 데이터를 읽을 때 사용하는 함수

원형

BOOL WINAPI ReadFile(

__in HANDLE hFile, //읽을 파일 핸들

__out LPVOID lpBuffer, //읽은 데이터를 저장할 버퍼의 주소 값.

__in DWORD nNumberOfBytesToRead, // 읽어 들일 데이터의 크기

__out_opt LPDWORD lpNumberOfBytesRead, // 읽어 들인 데이터의 크기의 변수 주소 값.

__inout_opt LPOVERLAPPED lpOverlapped //

);

*WriteFile() 함수

- 파일에 데이터를 쓸 때 사용하는 함수

원형

BOOL WINAPI WriteFile(

__in HANDLE hFile,

__in LPCVOID lpBuffer,

__in DWORD nNumberOfBytesToWrite,

__out_opt LPDWORD lpNumberOfBytesWritten,

__inout_opt LPOVERLAPPED lpOverlapped

);

*GetFiletime() 함수

- MAC 타임을 얻기 위한 함수.

- FILETIME 구조체는 시간 정보를 나타내는 8바이트 자료형. UTC 기반으로 시간을 표현해 준다.

원형

BOOL WINAPI GetFileTime(

__in HANDLE hFile,

__out_opt LPFILETIME lpCreationTime,

__out_opt LPFILETIME lpLastAccessTime,

__out_opt LPFILETIME lpLastWriteTime

);

* FileTimeToSystemTime() 함수

- 시간 포멧을 변경해준다.

원형

BOOL WINAPI FileTimeToSystemTime(

__in const FILETIME *lpFileTime,

__out LPSYSTEMTIME lpSystemTime

);

* 시간 포멧 변경 시 필요한 구조체.

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, *PSYSTEMTIME;

*SystemTimeToTzSpecificLocalTime() 함수

- UTC를 지역별, 국가별 시간대로 변경해준다.

원형

BOOL WINAPI SystemTimeToTzSpecificLocalTime(

__in_opt LPTIME_ZONE_INFORMATION lpTimeZone, //시간대에 대한 정보.NULL 전달 시 현재 시스템의 시간대 정보가 기준이 된다.

__in LPSYSTEMTIME lpUniversalTime,

__out LPSYSTEMTIME lpLocalTime

);

*GetFileSize() 함수

- file사이즈를 가져오는 함수

- 4G이상은 불가.

원형

DWORD WINAPI GetFileSize(

__in HANDLE hFile,

__out_opt LPDWORD lpFileSizeHigh

);

*GetFileSizeEx() 함수

-4G 이상의 파일 사이즈를 얻어주는 함수

원형

BOOL WINAPI GetFileSizeEx(

__in HANDLE hFile,

__out PLARGE_INTEGER lpFileSize

);

-> LARGE_INTEGER 구조체에는 8Byte를 상하위 비트로 나누어서 담는다.

*GetFileAttributes() 함수

- 파일 특성 정보는 반환 값으로 담긴다.

원형

DWORD WINAPI GetFileAttributes(

__in LPCTSTR lpFileName

);

- 32 bit DWORD 값에 비트 별로 속성 값이 들어 가게 된다. 총 12가지 정보가 들어간다.

- 비트 별 정보는 msdn을 참고할 것!

*SetFileAttributes() 함수

- 파일 특성 정보를 세팅한다

원형

BOOL WINAPI SetFileAttributes(

__in LPCTSTR lpFileName,

__in DWORD dwFileAttributes

);

*GetFileInformationByHandle() 함수

- 핸들을 이용해 파일 정보를 얻어오는 함수

원형

BOOL WINAPI GetFileInformationByHandle(

__in HANDLE hFile,

__out LPBY_HANDLE_FILE_INFORMATION lpFileInformation

);

*_BY_HANDLE_FILE_INFORMATION의 원형

typedef struct _BY_HANDLE_FILE_INFORMATION {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD dwVolumeSerialNumber;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD nNumberOfLinks;

DWORD nFileIndexHigh;

DWORD nFileIndexLow;

} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION;

*GetFullPathName() 함수

- 파일 이름을 통해서 파일경로 정보를 얻어주는 함수

원형

DWORD WINAPI GetFullPathName(

__in LPCTSTR lpFileName,

__in DWORD nBufferLength, //저장 가능한 문자열의 길이임을 주의할 것!!

__out LPTSTR lpBuffer,

__out LPTSTR *lpFilePart //버퍼의 특정 위치를 가리키는 포인터 값이 저장. 마지막 역슬래시 다음 번지 주소 값이 저장됨.

);

*SetFilePointer() 함수

- 파일 포인터의 위치를 정해준다.

원형

DWORD WINAPI SetFilePointer(

__in HANDLE hFile,

__in LONG lDistanceToMove, //32bit 기반일 때 이 인자 값만 사용. 이동시킬 거리를 지정.

__inout_opt PLONG lpDistanceToMoveHigh, //64bit 기반일 때 상위 4Byte 값이 담긴다. 32bit에서는 NULL 전달.

__in DWORD dwMoveMethod

);

*CreateDirectory() 함수

- 디렉터리 생성.

원형

BOOL WINAPI CreateDirectory(

__in LPCTSTR lpPathName,

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

*RemoveDirectory() 함수

- 디렉토리 제거

원형

BOOL WINAPI RemoveDirectory(

__in LPCTSTR lpPathName

);

*GetCurrentdirectory() 함수

- 현재 디렉토리를 얻어온다.

원형

DWORD WINAPI GetCurrentDirectory(

__in DWORD nBufferLength,

__out LPTSTR lpBuffer

);

*SetCurrentDirectory() 함수

- 현재 디렉토리 위치를 변경한다.

원형

BOOL WINAPI SetCurrentDirectory(

__in LPCTSTR lpPathName

)

* GetSystemDirectory() 함수

- 시스템 디렉터리의 위치를 얻어온다.

원형

UINT WINAPI GetSystemDirectory(

__out LPTSTR lpBuffer,

__in UINT uSize

);

*GetWindowsDirectory() 함수

- window 디렉토리의 위치를 얻어온다

원형

UINT WINAPI GetWindowsDirectory(

__out LPTSTR lpBuffer,

__in UINT uSize

);

*SearchPath() 함수

- 파일의 위치를 찾아준다.

원형

DWORD WINAPI SearchPath(

__in_opt LPCTSTR lpPath,

__in LPCTSTR lpFileName,

__in_opt LPCTSTR lpExtension,

__in DWORD nBufferLength,

__out LPTSTR lpBuffer,

__out_opt LPTSTR *lpFilePart

);

-> 표준 검색 경로

1. 실행 중인 프로그램이 로드 된 디렉토리

2. 현재 디렉토리

3. 시스템 디렉토리

4. windows 디렉토리

5. 환경변수 PATH에 등록된 디렉토리

*FindFirstFile() 함수

- 파일 목록 중 첫 번째 파일의 핸들 값을 반환. 정보는 두 번째 인자에 저장.

원형

HANDLE WINAPI FindFirstFile(

__in LPCTSTR lpFileName,

__out LPWIN32_FIND_DATA lpFindFileData

);

*FindNextFile() 함수

- 파일 목록 중 다음 파일의 핸들 값을 반환. 정보는 두 번째 인자에 저장.

원형

BOOL WINAPI FindNextFile(

__in HANDLE hFindFile,

__out LPWIN32_FIND_DATA lpFindFileData

);

*FindClose() 함수

- 생성된 커널 오브젝트를 해제.

원형

BOOL WINAPI FindClose(

__inout HANDLE hFindFile

);

*파일 정보 저장되는 구조체.

typedef struct _WIN32_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD dwReserved0;

DWORD dwReserved1;

TCHAR cFileName[MAX_PATH];

TCHAR cAlternateFileName[14];

} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

================================================ 19 장 =====================================

*GetOverlappedResult() 함수

- I/O 연산이 완료된 이후에 전송된 데이터 크기 확인을 위함.

원형

BOOL WINAPI GetOverlappedResult(

__in HANDLE hFile, // 입력 및 출력 결과 학인을 위한 파이프 핸들

__in LPOVERLAPPED lpOverlapped, // overlapped 구조체 변수의 주소 값

__out LPDWORD lpNumberOfBytesTransferred, // 실제 전송이 완료된 바이트 크기를 얻기 위한 변수의 주소 값

__in BOOL bWait // I/O 연산이 끝나지 않은 상황에서의 처리를 결정.

);

*WriteFileEx() 함수

- 완료 루틴이 추가 됨.

원형

BOOL WINAPI WriteFileEx(

__in HANDLE hFile,

__in_opt LPCVOID lpBuffer,

__in DWORD nNumberOfBytesToWrite,

__inout LPOVERLAPPED lpOverlapped,

__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine //완료 루틴.

);

*ReadFileEx() 함수

- 완료 루틴이 추가 됨

원형

BOOL WINAPI ReadFileEx(

__in HANDLE hFile,

__out_opt LPVOID lpBuffer,

__in DWORD nNumberOfBytesToRead,

__inout LPOVERLAPPED lpOverlapped,

__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

*OVERLAPPED_COMPLETION_ROUTINE 함수 포인터 모양.

원형

typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE) (

[in] DWORD dwErrorCode,

[in] DWORD dwNumberOfBytesTransfered,

[in] LPVOID lpOverlapped

);

*SetWaitableTimer() 함수

- 완료 루틴 타이머. 일정 시간이 되면 콜백함수를 호출한다.

원형

BOOL WINAPI SetWaitableTimer(

__in HANDLE hTimer,

__in const LARGE_INTEGER *pDueTime,

__in LONG lPeriod,

__in_opt PTIMERAPCROUTINE pfnCompletionRoutine,

__in_opt LPVOID lpArgToCompletionRoutine,

__in BOOL fResume

);

* SetWaitableTimer 함수의 네 번째 인자 값.

원형

VOID CALLBACK TimerAPCProc(

__in_opt LPVOID lpArgToCompletionRoutine,

__in DWORD dwTimerLowValue,

__in DWORD dwTimerHighValue

);

*QueueUserAPC() 함수

- APC Queue에 호출하고자 하는 함수 정보를 전달 할 때 사용하는 함수

원형

DWORD WINAPI QueueUserAPC(

__in PAPCFUNC pfnAPC, //비동기로 호출될 함수를 지정

__in HANDLE hThread, // APC Queue를 소유하는 쓰레드 핸들을 지정.

__in ULONG_PTR dwData // 등록된 함수 호출 시 전달할 인자.

);

========================================== 20 장 =================================================

*VirtualAlloc() 함수

- 가상 메모리를 할당해주는 함수

- MEM_RESERVE 와 MEM_COMMIT으로 메모리의 상태를 설정해줄 수 있다.

원형

LPVOID WINAPI VirtualAlloc(

__in_opt LPVOID lpAddress, //메모리의 시작 주소. NULL 전달시 임의의 주소 할당됨.

__in SIZE_T dwSize, //할당하고자 하는 메모리의 크기를 바이트 단위로.

__in DWORD flAllocationType, //메모리 할당의 타입을 결정. MEM_RESERVE, MEM_COMMIT

__in DWORD flProtect //페이지별 접근방식에 제한을 두는 용도로 사용.

);

*VirtualFree() 함수

- 할당한 메모리를 해제 해주는 함수.

원형

BOOL WINAPI VirtualFree(

__in LPVOID lpAddress,

__in SIZE_T dwSize,

__in DWORD dwFreeType //MEM_DECOMMIT과 MEM_RELEASE 를 전달.

);

*HeapCreate() 함수

- 힙을 생성하는 함수

원형

HANDLE HeapCreate(

DWORD flOptions, // 생성되는 힙의 특성을 부여 (0 을 전달시 가장 일반적인 힙 생성)

// HEAP_GENERATE_EXCEPTIONS : 오류 발생시 NULL이 아닌 예외 발생

// HEAP_NO_SERIALIZE : 생성된 힙의 메모리 할당과 해제에 대해 동기화 처리를 하지 않는다.

SIZE_T dwInitialSize, // dwMaximumSize 에서 지정한 메모리 중에서 초기에 할당할 COMMIT 페이지를 지정한다

SIZE_T dwMaximumSize // 생성되는 힙의 크기 결정.

// 지정하는 크기에 해당하는 페이지의 수만큼 RESERVE 상태가 된다.

// 0이 아닐 경우 힙은 증가 가능 한 메모리(Growable Heap)가 된다

);

출처http://dakuo.tistory.com/128

*HeapDestroy() 함수

- 힘을 해제시키는 함수

원형

BOOL HeapDestroy(

HANDLE hHeap // 반환하고자 하는 힙의 핸들

);

출처http://dakuo.tistory.com/128

*HeapAlloc() 함수

- 힙에 메모리를 할당하는 함수.

- 요청 크기에 해당하는 페이지 수만큼 COMMIT 상태로 변경시킨다.

원형

LPVOID HeapAlloc(

HANDLE hHeap, // 메모리 할당이 이뤄질 힙의 핸들

DWORD dwFlags, // HEAP_GENERATE_EXCEPTIONS : 오류 발생시 NULL이 아닌 예외 발생

// HEAP_NO_SERIALIZE : 함수 호출 시 동기화 처리되지 않는다.

// (HeapCreate 함수호출에서 지정했다면 중복 지정 할 필요는 없다)

// HEAP_ZERO_MEMORY : 할당된 메모리는 0으로 초기화

// 둘 이상의 속성을 비트 단위 연산자 OR( | )로 동시 지정 가능

SIZE_T dwBytes // 할당하고자 하는 메모리의 크기를 지정

// (증가 가능 한 힙이 아닐 경우 최대 크기 0x7FFF8)

);

출처http://dakuo.tistory.com/128

*HeapFree() 함수

- 힙에 메모리를 해제하는 함수

- Reserve 상태도 가능

원형

BOOL HeapFree(

HANDLE hHeap, // 해제할 메모리를 담고 있는 힙을 지정

DWORD dwFlags, // HEAP_NO_SERIALIZE 가 인자로 올 수 있다, 일반적 : 0

// (HeapCreate 함수호출에서 지정했다면 중복지정할 필요는 없다)

LPVOID lpMem // 해제할 메모리의 시작 주소 지정

);

출처http://dakuo.tistory.com/128

*CreateFileMapping() 함수

- 파일 연결 오브젝트 생성을 위한 함수

원형

HANDLE WINAPI CreateFileMapping(

__in HANDLE hFile, //파일 핸들

__in_opt LPSECURITY_ATTRIBUTES lpAttributes, //보안 속성

__in DWORD flProtect, //PAGE_READONLY, PAGE_READWRITE

__in DWORD dwMaximumSizeHigh, // 연결할 메모리 최대 크기의 상위 4 바이트, 대용량 파일이 아니면 보통 0

__in DWORD dwMaximumSizeLow, // 메모리 최대 크기의 하위 4 바이트

__in_opt LPCTSTR lpName // 파일 연결 오브젝트의 이름 지정. NULL을 전달 할 수 있음

);

*MapViewOfFile() 함수

- 파일과 메모리를 실제로 매핑 시켜주는 함수.

원형

LPVOID WINAPI MapViewOfFile(

__in HANDLE hFileMappingObject, // 커널 오브젝트의 핸들

__in DWORD dwDesiredAccess, // 연결된 메모리의 접근권한. CreateFileMapping 함수에대해 종속적이다.?

__in DWORD dwFileOffsetHigh, // 메모리에 연결할 파일의 오프셋을 지정한다.

__in DWORD dwFileOffsetLow, // 오프셋 하위 4 비트

__in SIZE_T dwNumberOfBytesToMap //메모리에 연결할 실제 크기를 바이트 단위로 지정.

);

*UmapViewOfFile() 함수

- 매핑된 메모리를 해제.

원형

BOOL WINAPI UnmapViewOfFile(

__in LPCVOID lpBaseAddress

);

*FlushViewOfFile() 함수

- 메모리에 캐쉬된 데이터를 파일에 저장하게 해주는 함수.

원형

BOOL WINAPI FlushViewOfFile(

__in LPCVOID lpBaseAddress, //파일에 저장할 메모리의 시작 주소

__in SIZE_T dwNumberOfBytesToFlush // 파일에 저장할 데이터 크기를 바이트 단위로 지정.

);

[출처] 시스템 함수 정리|작성자 smuoon4680

'Development > C/C++' 카테고리의 다른 글

[Mutex]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[Mutex Thread 동기화 예제]  (0) 2011.11.30
[Sleep함수]  (0) 2011.11.29
[thread에서 _beginthreadex의 void *arglist로 스레드에 여러 인수 넘겨주는 방법]  (0) 2011.11.23
Posted by cyj4369
,

// Kernel object Mutex Thread 동기화 예제
// 1.signaled == 소유가 가능한 상태:
// WaitForSingleObjet 함수를 호출하여 전달된 mutex Handle인자를
// non-signaled 상태로 변경하여 이미 소유되어진 상태로 만든다. (소유 잠금 함수)
// non-signaled == 이미 소유되어진 상태:
// ReleaseMutex 함수를 호출하여 전달된 mutex Handle인자를
// singnaled 상태로 변경하여 소유가능 상태로 만든다. (소유 해제 함수)

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>

DWORD WINAPI ThreadIncrement(void *arg);
void ErrorHandling(char *message);

char thread1[] = "A Thread";
char thread2[] = "B Thread";

// 임계영역에 해당되는 전역변수 선언
// 다중 thread함수에 의해 값이 변경되는 변수
int number = 0;
// 핸들 자료형으로 mutex핸들로 사용할 변수 선언
HANDLE hMutex;

int main(int argc, char *argv[])
{
HANDLE hThread[2]; // 핸들 자료형으로 thread핸들로 사용할 변수 선언
DWORD dwThreadID[2]; // 생성되는 thread의 ID로 사용할 변수 선언

// mutex를 생성
// (보안관련 설정: NULL, 소유여부 설정: FALSE(==signaled) , Mutex이름: NULL)
// 소유가 가능한 상태로 mutex 를 생성
hMutex = CreateMutex(NULL, FALSE, NULL);

// mutex 생성 실패시 처리
if(hMutex==NULL)
ErrorHandling("CreateMutex() Error");

// thread에 안전한 함수 호출 방식으로 thread함수 호출함과 인자를 넘겨 주면서 thread ID생성
hThread[0] = (HANDLE) _beginthreadex(NULL, 0, ThreadIncrement, (void*)thread1, 0, &dwThreadID[0]);
hThread[1] = (HANDLE) _beginthreadex(NULL, 0, ThreadIncrement, (void*)thread2, 0, &dwThreadID[1]);

// thread 생성 실패시 처리
if(hThread[0] == 0 || hThread[1] == 0)
ErrorHandling("_beginthreadex() Error");

// thread함수 처리 종료 까지 대기한다.
if(WaitForMultipleObjects(2, hThread, TRUE, INFINITE) == WAIT_FAILED)
ErrorHandling("WaitForMultipleObjects() Error");

// thread함수에 의해 변경된 임계영역에 해당하는 number 값을 출력
printf("main() function end, last number : %d \n", number);

// 생성되었던 mutex핸들을 소멸 시킨다.
// CloseHandle함수는 어떠한 handle이라도 소멸 시킬수 있다.
// 여기서는 mutex 핸들을 소멸 시키는 것을 보여주고 있다
CloseHandle(hMutex);

return 0;
}

DWORD WINAPI ThreadIncrement( void *arg )
{
int i;

for(i=0; i<5; i++){
// mutex를 non-signaled 상태로 변경(소유를 한다음 소유 불가능 상태로 잠금)
WaitForSingleObject(hMutex, INFINITE);
Sleep(100); // 실행결과를 눈으로 확인 하기 위해 사용 ^^
number++;
printf("Run : %s, number : %d \n", (char*)arg, number);
// mutex를 signaled 상태로 변경(소유를 포기한다음 소유가능 상태로 해제함)
// 참고로 참조하는 부분도 mutex로 묶어준 이유는 참조하는 순간 다른 thread함수에 의해
// 값이 변경되는 것을 막기 위함이다.
ReleaseMutex(hMutex);
}

return 0;
}

void ErrorHandling( char *message )
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}

Posted by cyj4369
,

[Sleep함수]

Development/C/C++ 2011. 11. 29. 20:14
#include <windows.h>헤더 사용

Sleep(1000);
1초 슬립 
Posted by cyj4369
,

[PQ4R 학습 방법]

기타/기타 2011. 11. 29. 03:09
한 장의 내용을 처음부터 무작정 읽기 시작하기 전에 우선 전체 장의 구성을 훑어보는 것이 좋다. 전체 장이 어떤 하위 단락으로 구성되어 있으며, 각 단락의 제목은 무엇이고, 다시 어떤 하위 문단들로 나눠져 있고 그 문단에 붙여진 소제목은 무엇인지 살펴보는 것이다. 이 전체 구조를 노트에 다시 한 번 적어보는 것도 좋은 방법이다. 공부할 내용이 어떤 구조로 되었는지, 공부할 내용이 각기 어떤 부분에 들어가 있는지를 파악하는, 일종의 틀을 만드는 작업이다. 아울러 책장을 넘기며, 재미있어 보이거나 관심을 끄는 그림, 도표 등도 훑어본다. 나중에 정독을 할 것이기에 이해가 안 돼도 상관없다(Preview, 훑어보기).
 
훑어보며 해야 할 중요한 작업은 마음에 떠오르는 의문과 생각을 정리하는 것이다. 예를 들어 ‘부호화’라는 단어를 보고, “내가 아는 것은 모리스 부호인데, 기억도 이런 부호란 말인가?”라는 식의 의문을 갖는 것이다. 백지에 기록하는 것이 아니고, 알고 있는 사전 지식과 연결시키는 것이 학습이다. 의문이 떠오른다는 것은 바로 이런 연결을 시도하는 과정이다. 물론 어떤 의문도 떠오르지 않을 때는 소제목을 그냥 질문으로(“인출이란 게 뭐야?”) 만들면 된다. 질문을 만드는 게 사실 쉬운 일은 아니기에 적극적인 노력과 훈련이 필요하다 .(Question, 의문제기)

다음은 읽는 과정이다. 꼼꼼히 문장 하나
하나를 읽으며, 훑어보면서 생겼던 의문의 답을 찾도록 한다. 그리고 이해가 어려운 부분은 표시를 하고(나중에 선생님이나 다른 사람에게 질문 할 수 있도록), 한 문단 읽기를 마친 후에는, 그 문단의 요지를 한 두 문장으로 다시 요약해 책 옆 공간이나 노트에 적어본다. 이 세 과정은 말하자면 자신의 이해를 점검하며 읽기를 하라는 것이다. 특히 핵심 요지를 쓸 수 없다면, 이해에 실패한 것이라고 해도 과언은 아니다. 교과서 읽기 전후에 강의나 수업을 듣는 것이 보통이기에, 수업 내용과 책 읽은 내용을 연결시키도록 한다. 자신이 요약했던 노트와 강의 노트를 합쳐 새롭게 내용을 구성하면 금상첨화다.(Read, 능동적 읽기)


 
읽을 때나 읽고 나서 해야 할 중요한 작업은, 새로 접한 용어들(개념)을 잘 암기하는 것이다. 내용이 새롭다는 것은 필수적으로 새로운 용어를 배워야 한다는 것을 의미한다. 여기서 암기하라는 것은 용어들을 단순히 앵무새처럼 입으로 반복하라는 것이 아니다. 용어가 의미하는 바를 잘 이해하여, 용어가 어떻게 사용되며, 용어의 구체적이 예가 무엇인지를 말할 수 있도록 하라는 것이다. 대부분의 책에서 주요 용어들은 본문에서 고딕과 같은 다른 폰트로 표시하거나 장의 끝 부분에 따로 모아 놓는다.(Recite, 뜻을 암기하기)
 
한 장의 읽기가 끝났다면 내용을 전체적으로 숙고해보는 담금질 과정이 필요하다. 한 장의 구조를 머릿속에 떠올려 보고, 각 단락과 문단에 포함된 내용을 기억해 보고, 주요 용어를 스스로 설명해 보고, 수업에서 중요하다고 언급되었던 내용이 무엇인지를 머릿속에서 정리하는 것이다. 기억이 잘 안 되면 책이나 노트를 다시 보고 확인한다.(Reflect, 숙고하기)
 
지금까지의 과정을 정리하자. 1) 한 장의 내용이 어떻게 조직, 구성되었는지를 파악하고  머릿속에 기본적인 틀로 만들어 놓고, 2) 이미 알고 있는 지식과 연결시키려고 노력해야 하며, 3) 읽으면서 자신의 이해를 점검하고 실패하는 경우 다시 읽거나, 다른 사람에게 질문하여 해결해야 하고, 4) 주요 용어들을 잘 이해하여 능숙하게 사용할 수 있도록 만들며, 5) 이 네 가지 작업을 머릿속에서 연습한다. 6) 그리고 시험을 앞두고 이 전 과정을 다시 한 번 복습(Review)하면 된다. 이 여섯 과정이 PQ4R(Preview, Question, Read, Recite, Reflect, Review)이라고 불리는 학습 방법이며 기억을 돕는다고 알려져 있다.
Posted by cyj4369
,


자신감 있고 예의바른 느낌 줘

정열의 빨강, 차분한 파랑, 부러운 녹색 등 감정을 이야기할 때 색상이 상당히 밀접한 연관성을 갖는다.

검정색 미니드레스는 세련된 느낌과 섹시하다는 느낌을 준다. 또 우중충한 날씨에 노란색 우산이 탁 펴지면 햇살이 비치는 듯한 느낌을 받는다.

우리는 색상에 따라 다양한 반응을 보인다. 색상 트렌드를 예측하는 미국 색상학회 레슬리 해링턴 전무이사는 “개인적인 관계에서부터 사회적 문화적 영역까지 영역별로 해당하는 특정한 색상이 있다”고 말한다. 예컨대 경고를 나타내는 빨간색은 소방차나 앰뷸런스 등을 연상시켜 심장박동수를 높인다. 노란색은 할머니의 부엌 같은 느낌을 줌으로써 긍정적인 생각을 갖게 한다. 또 면접 등에서 자신감을 주고 싶다면 자주색 복장을 갖추면 유리한 입장에 설 수도 있다.

패션 전문가 제니 메이는 옷이 감정을 바꿀 수 있다며 ‘의복치료(wearapy)’를 통해 감정 장애를 치료할 수도 있다고 주장한다. 그녀는 “바람이 부는 날에는 청바지나 처진 스웨터는 입지 않도록 한다. 녹색 미니스커트에 장식이 달린 숄과 장신구를 걸쳐야 한다. 이는 주위 사람들에게 깊은 인상을 남길 수 있다. 또한 스스로를 귀여워 보이게 할 수도 있다. 남들에게 귀엽게 보인다고 느껴지면 기분이 한결 좋아질 것이다. 색상을 바꾸는 것만으로 기분도 달라질 수 있는 것”이라고 밝힌다.

지금 기분을 더 좋게 만들고 싶은가. 미국 인터넷 매체 허핑턴포스트는 27일 색상과 감정 변화의 연관성에 대해 정리했다.

정열의 빨간색

뜨거움, 정열을 뜻하는 빨강은 두려움, 분노, 열정과 같은 감정을 나타내기도 한다. 해링턴은 “빨간색은 가장 복잡한 색상”이라고 말한다. 빨간색 옷은 기분을 극적으로 바꿔준다. 분홍색 계열과 암적색도 마찬가지다.

독신여성이 남성의 관심을 끌 수 있는 가장 좋은 색상은 빨간색이라는 연구 결과도 있다. 빨간색 옷을 입으면 원하지 않아도 관심을 받게 된다는 것이다. 로체스터 대학교 앤드류 엘리어트 심리학과 교수는 “이는 빨간색에 반응하는 영역이 있기 때문”이라며 “빨간색은 열정과 연계돼 성적 흥분을 느낄 때 피부가 붉어지는 형태로 그 변화가 드러난다”고 설명한다.

‘섹시한 고양이’처럼 보이기를 원한다면 빨간색에 반응하는 영역을 압박할 필요가 있다. 밝은 빨간색으로 손톱물을 들이거나 입술을 칠하는 것이다. 해링턴은 “빨간 입술은 최고의 액세서리가 될 수 있다. 특히 검정색 옷을 입은 경우 더욱 그렇다”면서 “피부톤에 약간 붉은색을 띠게 함으로써 더 많은 자신감을 가질 수 있게 한다”고 말한다.

차분한 파란색

스트레스를 많이 받은 날 긴장을 늦출 필요가 있는가. 파란색 옷을 입어보라. 해링턴은 “심리학적으로 파란색은 붉은색과 대치된다. 이는 혈압이 낮아지는 것과 같다”면 “빨간색이 사람을 흥분시킨다면 파란색은 이와 반대로 사람을 우울하지 않을 정도로 차분하게 만든다”고 말한다. 이는 하늘이나 바다처럼 자연스러운 색을 연출해 차분함을 느끼게 한다는 것이다. 메이는 “여성들에게 중요한 만남에는 파란색 옷을 입으라고 권한다”며 “첫 번째 데이트에서 터키석이나 밝은 바다색의 스웨터 또는 캐시미어 숄을 걸치라는 것이다. 이는 강한 첫인상과 안정감을 줄 수 있다”고 설명한다.

또한 해링턴은 면접을 보러 가거나 배우자의 부모님을 처음 만나는 경우를 예로 들며 “파란색은 신뢰, 강인함, 의지력 등과 연결된다”고 설명한다. 의지와 신뢰성이 있는 이미지를 줄 수 있다는 것이다.

부드러운 노란색

노란색은 긍정적인 성향과 부정적인 성향 모두를 가지고 있다. 햇빛, 즐거움에 황달이나 질병과 같은 상태까지 모두 포함한다. 메이는 “노란색 옷은 사람들 사이에서 돋보이게 해 준다”며 “엑스트라라는 프로그램에서 리포터를 할 때 쌀쌀맞은 유명인사들도 노란색 옷을 입고 만나러 가면 웃었다”고 설명했다.

해링턴은 지나치게 노란색이 많은 옷을 입으면 걸어 다니는 바나나처럼 보여 우스워 보일 수 있다고 한다. 전체적으로 노란색 옷을 걸치기보다 노란색 액세서리로 포인트를 주는 것이 더 낫다는 것이다. 또한 모든 사람에게 밝은 느낌을 주는 것은 아니다. 해링턴은 “피부가 노란색인 사람은 다소 옷을 입는데 곤란을 겪을 수 있다”며 “군청색이나 파란색 계열처럼 누구나 입을 수 있는 옷에 비해 알맞은 옷을 찾기가 어렵다”고 말한다.

딱 맞는 오렌지색

태양빛의 노란색과 붉은색이 만난 오렌지색은 가장 인기있는 색상이다. 사실 오렌지색은 붉은색이 불편하다고 느낄 때 대신할 수 있는 가장 좋은 색이다. 그렇다고 따분한 색이라는 뜻은 아니다. 해링턴은 “오렌지색은 가장 일상적이고 활동적인 색상”이라며 “빨간색에 비해 훨씬 점잖은 느낌을 준다”고 말한다. 오렌지색은 창의적 업무를 추진할 때 가장 어울리는 색상이다. 메이는 “오렌지색은 열정과 창의성을 자극하는 색상”이라며 “이는 인내와 창의성을 상징하는 색이기도 하다”고 말했다. 오렌지색은 또 위기에 강한 사람이라는 느낌을 줄 수 있다. 약간은 날카로운 듯하지만 지나치지 않다는 느낌을 주기 때문이다. 해링턴은 “오렌지색은 중간을 상징한다”며 “재미있기도 하면서 조금은 어려운 듯한 그러나 너무 어렵지는 않은 느낌을 주는 색”이라고 설명한다. 그렇기 때문에 화장품에서도 오렌지색이 가장 많다는 것이다.

고급스러운 자주색

메이는 가장 고급스러운 색으로 자주색을 든다. 그녀는 “면접 등에서 자신감 있고 예의바른 느낌을 주고 싶다면 자주색을 입으라”고 말한다. 또 어려보이는 얼굴이라면 자주색을 이용한 화장으로 보다 차분하고 어른스러워 보이게 할 수 있다고 조언한다.

검정색으로 돌아가다

검정색은 감정을 북돋아주는 대신 2~3kg 정도 날씬해 보이게 해준다. 해링턴은 “하얀색 바지보다 검정색 청바지를 입는 것이 더 날씬해 보인다는 것은 잘 알려진 사실”이라고 말한다. 그러나 검정색은 의도하지 않은 느낌을 줄 수도 있다. 장례식처럼 우울한 인상을 주거나 보석에 중독된 듯한 느낌(영화 ‘티파니에서 아침을’에 나온 오드리 헵번 같은)을 줄 수도 있다. 옛날 영화에서 악당들은 검정색 옷을 입는다. 최근 몇 년 사이에는 검정색 리무진, 검정색 가죽구두, 우아한 검정색 정장 등 상류층을 나타내는 색상으로 변했다. 검정색은 당신이 격식을 차리고 점잖아 보이고 싶다면 가장 적당한 색상이다. 메이는 “검정색은 무척 우아해 보일 수 있다”며 “모든 여성들에게는 짧은 검정드레스가 필요하다. 이것은 사람들 사이에서 당신을 돋보이게 하고 당신을 빛나게 한다”고 설명했다.

'기타 > 기타' 카테고리의 다른 글

[영작연습을 위한 1001가지 문장]  (0) 2012.05.26
[PQ4R 학습 방법]  (0) 2011.11.29
[스티브잡스의 스탠포드 대학 연설]  (2) 2011.11.02
[마음을 움직이는 조언들]  (0) 2011.10.27
[초콜렛과 집중력]  (2) 2011.10.27
Posted by cyj4369
,

<input type="button" onclick="javascript:history.back()" value="뒤로">


<input type="button" onclick="javascript:history.forward()" value="앞으로">


<input type="button" onclick="javascript:history.go(-3)" value="3단계 뒤로">


<input type="button" onclick="javascript:history.go(0)" value="현제 페이지">


<input type="button" onclick="javascript:history.go(3)" value="3단계 앞으로">


window.location.reload(); 또는,

<a href="javascript:location.reload()">새로고침</a>

Posted by cyj4369
,
Old February 25th, 2004, 11:40 AM
Member
 
Join Date: Oct 2003
Posts: 204
urika is an unknown quantity at this point (<10)
putting values in void *arglist

hi ,
i want to run a threads using _beginthread(...)
(no MFC)
inside the threadfunc i want to call a function with many variables.
how do i use the void *arglist so it points to a few variables ?
i hope my question makes sence 
thank u
Reply With Quote
  #2    
Old February 25th, 2004, 11:47 AM
gstercken's Avatar
Moderator
Power Poster
 
Join Date: Sep 2002
Location: 14° 39'19.65"N / 121° 1'44.34"E
Posts: 9,815
gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)
Re: putting values in void *arglist

Quote:
Originally posted by urika 
how do i use the void *arglist so it points to a few variables ?
Usually by creating a class or struct which contains the variables.
You would then use the void* to pass the pointer to an instance of
that class or struct, which you would have to cast back to the actual
type before accessing the members.
__________________
Guido Stercken-Sorrenti
Reply With Quote
  #3    
Old February 25th, 2004, 11:51 AM
Member
 
Join Date: Oct 2003
Posts: 204
urika is an unknown quantity at this point (<10)
thanks!
Reply With Quote
  #4    
Old February 29th, 2004, 05:34 AM
Member
 
Join Date: Oct 2003
Posts: 204
urika is an unknown quantity at this point (<10)
i call a function :
Code:
 bool MapViewInit(GEO p1, GEO p2, DISPLAY Disp, CONTROL Ctrl, HINSTANCE hInst)
{
		MapThreadArgList maparglist;  ////?????
		maparglist.Ctrl=Ctrl;
		maparglist.Disp=Disp;
		maparglist.p1=p1;
		maparglist.p2=p2;
		maparglist.hInst=hInst;
		HANDLE handle1 =(HANDLE)_beginthread( MapThreadFunc,0,
(void *)&maparglist); // create thread COUT << "\n >>> MapViewInit Run Successfully <<<\n"; return true; }
in order to run the thread i do :
Code:
void MapThreadFunc( void* args )
{
		GEO p1;
		GEO p2;
		DISPLAY Disp;
		CONTROL Ctrl;
		HINSTANCE hInst;
		MapThreadArgList arglist = *((MapThreadArgList*)args);
		p1=arglist.p1;
		p2=arglist.p2;
		Disp=arglist.Disp;
		Ctrl=arglist.Ctrl;
		hInst=arglist.hInst;
...
...
...
after i cast back to MapThreadArgList the info in arglist.p1 (and the others ) is lost.
what am i doing wrong?
Reply With Quote
  #5    
Old February 29th, 2004, 06:02 AM
gstercken's Avatar
Moderator
Power Poster
 
Join Date: Sep 2002
Location: 14° 39'19.65"N / 121° 1'44.34"E
Posts: 9,815
gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)gstercken has a reputation beyond repute (3000+)
Quote:
Originally posted by urika 
what am i doing wrong?
You are creating maparglist on the stack - it will be destroyed when it gets out of
scope (when you return from MapViewInit()). Allocate it on the heap, or keep it as a
member variable instead.
__________________
Guido Stercken-Sorrenti
Reply With Quote
  #6    
Old February 29th, 2004, 07:55 AM
Member
 
Join Date: Oct 2003
Posts: 204
urika is an unknown quantity at this point (<10)
thanks , it now works
Reply With Quote

결론
구조체를 사용하여 쓰레드에 넘겨줄 인수를 모두 넣는다. (구조체 정의를 전역변수로 해야 함)
구조체의 객체를 만든 다음 객체멤버에 값을 넣어준다.
통째로 객체를 넘겨준다.
스레드에서 구조체의 객체를 만들어 파라메터의 객체를 받는다.
쓰면된다~ 

'Development > C/C++' 카테고리의 다른 글

[Mutex Thread 동기화 예제]  (0) 2011.11.30
[Sleep함수]  (0) 2011.11.29
[CreateThread(), _beginthread(), _beginthreadex()의 차이]  (0) 2011.11.22
[select FD_SET FD_Zero FD_Clr FD_IsSet]  (0) 2011.11.22
[_beginthreadex 형변환문제]  (0) 2011.11.22
Posted by cyj4369
,