MFC/MFC클라이언트 35

MySQL 기본 사용법

MySQL 데이터베이스 스키마와 테이블 세팅기본 PORT번호는 3306으로 설정되어 있음 (MySQL Defult)데이터베이스는 해킹 사고의 근간.. 보통 해킹당했다! = DB 털렷다!adress가 데이터베이스 스키마. 그 아래 하위로 Table을 만들 수 있다PK = PreimaryKey 즉 중복 불가능키 그리고 나머지 약자도 오른쪽 아래 보면 표기되어 있다테이블에 데이터를 삽입하주고 Apply키를 누르면 들어감 book 테이블을 만들어서 userInfo와 연결해줄건데 아래와 같이 구성adressbook의 userifo의 name과 author을 연결해줬다는 뜻주의 사항 대소문자 구분x, 데이터 문자열은 구분o기본 코드사용사용법 직관적이고 어렵지도 않다번개모양 누르면 적은 코드가 실행됨INSERT UP..

동기화

▶ 동기화가 필요한 경우 - (멀티스레딩 환경에선 가장 중요하다)ㆍ Static 자료에 대해 접근하는 경우 (특히 포인터)    -> 어떤놈이 읽고 어떤놈이 쓰고를 동시에 하면..? 값이 엉킬수있으니 동기화가 꼭 필요하겠다 ㆍ list와 같은 자료구조가 static 메모리를 사용하고 있는 경우 ㆍ 여러 연산 주체(스레드, 프로세스)가 한 대상 메모리에 대해 읽기/쓰기를 병행하는 경우 ㆍ Cirical section이나 Kernel object를 활용해 동기화크리티컬 섹션 : Thread차원, 이거로 해결할 수 있으면 이거로 해결하는게 좋다커널 : 프로세스, 스레드 차원의 동기화며, 유한 자원이기에 불필요하게 낭비하면 안된다.# 원자성이란 쉽게말해 이 영역부터 이 영역까지는 보장해주는 걸로 일단 받아들이자..

스레드 상태 제어 (Running ,Suspended)

▶ Suspendedㆍ 쓰레드가 살아는 있으나 자원을 소모하지는 않는다 (대기상태)ㆍ 상태가 종료 되더라도 사라지지 않고 Suspended상태로 남아있게 된다.ㆍ 서스펜드와 Resume 상태를 왓다갓다 할 수 있게 다른곳에서 플래그를 제어해주고있다.ㆍ 제거를 할땐 Sleep을 쓰기보단 WaitForSingleObject를 이용해 종료하자▶ 스레드 강제 종료ㆍ TerminatedThread를 하면 강제종료인데, 이게 시스템 측면에선 진짜 제거하는게 아니라서 이러한 경고가 뜬다.ㆍ 디버그 메세지에서 쓰레드가 종료되었습니다. 라고는 되는데 End작동을 안한다.

쓰레드 종료 감지 및 동기화

▶ 쓰레드 플래그ㆍ While문을 대기하던 스레드들이 플래그가 TRUE가 되면서 종료가 될것이다ㆍ 쓰레드 내부에서 Sleep(100)을 주고 있기 떄문에 이정도면 다 무사히 종료가 됐겠군, 이라는 지연시간을 주는게 Sleep(500)이다 ㆍ 사실 위 예시가 적절하지는 않으나, 이런식으로 짜긴 한다. (큰일나진 않으니) -> 어처피 프로그램이 종료가 되는 마당에 쓰레드가 터지는게 문제가 될가? 싶어서 이렇게 짜는 경우도 있고, 상황에 따라 다르겠다 ㆍ 플레그는 사실 실제로 하면  std::atomic 와 같은 방법으로 하는게 더 정교함 동기화▶ 객체(이벤트, 스레드) 신호대기 API - 정교하게 쓰레드의 종료가 필요하면 이 API를 써야 한다. DWORD WaitForSingleObject ( [in] H..

작업자 쓰레드

▶ 쓰레드ㆍ 한 Process는 최소1개이상의 프로세스를 가진다 ㆍ 쓰레드는 개별화된 흐름과 전용 스택을 가진다. (VisualStudio 별다른 설정을 안했으면 1MB) ㆍ 모든 Thread는 자신이 속한 프로세스의 가상 메모리 공간을 공유한다. ㆍ C언어를 예시로 들면 int main() 함수에서 순차적으로 쭉쭉 코드가 내려가고 프로그램이 종료 되는게 1개의 쓰레드 - 최소 1개의 쓰레드 첫번째를 보통 메인쓰레드 라고 부름 ㆍ CWinThread가 MFC방식 (Win32와 차이가 거의 없다) ㆍ 이 Thread가 여러개 인게 멀티쓰레드ㆍ 병렬처리로 연속된 공간에 있으면 쓰레드 처리가 더 빠르다ㆍ 서로 의존성이 있다면 병렬처리 하는 의미가 별로 없을 것 같다. 같은 메모리공간을 공유하기에 의존성에 대..

타이머

▶ 타이머 ㆍ ms 단위로 WM_TIMER 메시지를 방생 시키며 메시지 자체는 윈도우 GUI 시스팀에 보냄    ㆍ WM_TIMER 메시지는 메시지 큐를 거쳐서 처리    -> 이 말은 즉 순차적으로 처리가 된다는 뜻, 그리고 메시지 큐는 크기의 한계가 있다. ㆍ 여러 개를 생성 할 수 있고 ID로 식별한다. ㆍ 마치 흐름이 분리되어 개별 처리되는 것 처럼 보이지만, 실제로는 그렇지 않음  ㆍ 주기적으로 반복 실행되는 코드를 작성해야 할 떄 유용하며, 시간 간격이 정확하지 않으니 주의하자 ㆍ 타이머에서 처리할 시간이 "간격" 보다 길 경우 뚝뚝끊기게 되니 주의하자   ▶ 메시지 루프의 다중화ㆍ 새치기 하기 위해 쓰는 함수, GUI가 락이 걸리는 상황 (멈추거나 끊기거나) 하는 그런 상황에서 대응을 할 때..

윈도우 크기 변화에 대응하기

▶ 윈도우 크기 변화에 대응하기ㆍWM_SIZE는 자식 윈도우가 생성되기도 전에 돌기도 한다. 따라서 크기 변화에 대응하는 코드를 작성할 땐자식 윈도우가 생성 되지 않은 시점일수도 있는 것을 고려 해야 한다.ㆍ Size 메세지 처리 이벤트를 만들고 이렇게 코드를 작성하면 오류가 난다 WHY?    -> 윈도우가 아직 생성되지도 않았는데 무브를 하라고 명령해서 오류가 나는 것 따라서 반드시 예외처리를 해줘야함ㆍ 이런식으로 수작업 코딩이 필요하다

리스트 박스와 콤보 박스

▶ 리스트와 콤보 박스ㆍ 이 인덱스가 "정렬"속성에 이슈가된다... 정렬된 위치에 추가가 된다ㆍ 정렬 속성이 없다면 맨 뒤에 추가됨 # 실습ㆍ 속성에 보면 정렬이 True로 되어있다ㆍ 이렇게 정렬이 되어서 들어간다. 그리고 변수는 컨트롤 변수를 만들어 줘야 한다.  ㆍ 선택이 되었을 때 텍스트를 띄워줄 수도 있다.ㆍ 처음에 빈 공간을 클릭하면 -1이 반환되기에 오류가 뜬다. 따라서 이렇게 예외처리를 해준다# 실습 - 콤보 박스ㆍ 이게 콤보박스다

버튼 (Push, Checkbox, Radio)

▶ 일반 버튼ㆍ Checkbox 와 Radio는 입력의 느낌이지만 내부적으론 버튼이다ㆍ Enter키에 버튼은 기본적으로 반응  ESC 는 취소 (엔터는 확인)  # 실습 - Push버튼ㆍ저 옵션을 True로 바꾸면 테두리가 생기며 엔터키에 반응하게 된다ㆍ 여기서도 변수추가를 해줄 수 있다. 화면에 구성을 해주고 한번에 변수를 추가할 때 편리하다ㆍ 버튼 이벤트는 반드시 바로위 부모클래스에 해줘야 적용이 된다.# 실습 - 체크박스 버튼ㆍ 체크박스는 이런식으로 사용해 주면 된다. ㆍ 이벤트도 간단하게 추가가 된다.# 라디오 버튼 실습ㆍ 이렇게 탭오더가 연속적으로 되어야 한다 ㆍ 맨 위에꺼만 그룹옵션을 켜주고, 아래 다른 라디오는 그룹 옵션을 꺼줘야 한다 ㆍ 클래스마법사를 이용해 int변수를 만들어 준다ㆍ 그럼..

통지 메세지와 모덜리스,통지 대화상자

▶ 통지 메세지ㆍ 컨트롤 윈도우는 기본적으로 Child이다.  ㆍ 내 상태 변화를 부모윈도우에게 알려주는걸 통지 메세지 라고 부른다  ㆍ 예를들어 Edit Control이 포커스를 받으면 커서가 깜빡깜빡 거린다.-> 포커스를 받으면 EN_SETFOCUS 라는 메세지가 온다-> SendMessage는 메시지큐를 스킵하고 제일먼저 처리됨 #포커스 실습ㆍ 포커스에 관한 이벤트를 이렇게 추가할 수 있다. ㆍ 포커스를 받았을때에 대한 코딩을 하면되겠다.ㆍ KILLFOCUS 부분을 만들어서 이렇게 비워주면   ▶  모덜리스(Modeless) 대화상자  ㆍ 이 ML에 대한 클래스를 생성해준 후 ㆍ 기존의 1번 방식이 아닌 2번 방식으로 동적 생성해준다. ㆍ 그럼 버튼을 누를때마다 이렇게 생성이 되고 완전히 독립적인 ..