소연의_개발일지
[C++ MFC] 로그 남길 때 동시 접근 문제, CCriticalSection 사용
개발공부/C++ 2025. 3. 13. 11:30

❓기존 문제점리스트 컨트롤 동시 접근 문제로그 남길 때 UI상에서 보여주는 로그창에 동시접근 문제삽입, 설정, 삭제 를 동시에 실행하면 문제 발생 가능성 있음파일 쓰기 동시 접근 문제CSV 남길 때 같은 로그 파일(.csv)에 대해 여러 쓰레드가 동시에 접근하면 충돌할 가능성이 있다 ✅해결 방법CCriticalSection을 사용하여 파일 동기화🔍 CCriticalSection( CCriticalSection ) 동작 방식1. 한 스레드가 WriteSystemLog에 진입하면 락을 획득 (CSingleLock lock(&csLogWrite, TRUE);)2. 다른 스레드는 락이 해제될 때까지 대기3. 파일 쓰기가 끝나면 락이 자동으로 해제됨CCriticalSection은 Windows 내부 최적화가 되..

article thumbnail
[C++ MFC] 화면 캡쳐하는 함수
개발공부/C++ 2025. 3. 11. 11:22

저장버튼 눌렀을 때 태우면 된다.창에 따라서 다르게 파라미터를 넘겨줌  이건 글로벌이나 헤더에 선언enum { ParamSetting = 0, AdminSetting, MasterSetting, MotionSetting};   이건 세팅할 때 태우면 됨void CDlgSetting::SaveDisplayCaptureSetting(int nType){ // 캡쳐후 저장하는 함수 // 1. 화면의 DC(디바이스 컨텍스트)를 가져옴 HDC h_screen_dc = ::GetDC(NULL); if (!h_screen_dc) return; // 2. 화면 해상도 정보를 얻음 int width = ::GetDeviceCaps(h_screen_dc, HORZRES); int height = ::GetDeviceCap..

article thumbnail
test dword ptr [eax],eax ; probe page. 오류 해결
개발공부/C++ 2025. 3. 10. 15:48

❓원인:스택 오버플로우 초과 문제일 때 나타나는 오류예: 함수 내에서 큰 배열(예: char buffer[1000000];)을 선언하면, 스택이 부족할 수 있음. ✅ 해결: 1. 큰 지역 변수는 힙으로 할당: 스택에 큰 배열을 두지 말고 new 또는 malloc을 사용해서 힙에 할당// 스택 할당 (문제 발생 가능)void func() { char largeArray[1000000]; // 스택 오버플로우 가능}// 힙 할당 (안전)void func() { char* largeArray = new char[1000000]; // 힙 메모리 사용 delete[] largeArray;} 2. 힙 메모리 늘려주기(추천!!)프로젝트 속성 → 시스템 → 스택 예약 크기 를 늘려준다.3. 재귀 ..

article thumbnail
[C++ MFC] 문자열 _T("")와 L""
개발공부/C++ 2024. 12. 26. 09:31

코드보다 아직도 헷갈려서 정리하는 것 _T("")유니코드(UTF-16)와 ANSI(멀티바이트) 간의 호환성을 유지하기 위해 사용._T는 tchar.h 헤더 파일에 정의된 매크로#define _T(x) _TEXT(x) ☞ 프로젝트 설정에 따라 유니코드나 멀티바이트 문자로 컴파일된다.유니코드 설정일 때: _T("text")는 L"text"로 처리멀티바이트 설정일 때: _T("text")는 "text"로 처리사용 예시TCHAR str[] = _T("Hello");  L""항상 유니코드(UTF-16) 문자열을 나타낸다.L 접두사는 문자열을 유니코드 리터럴로 지정한다.멀티바이트 환경에서도 유니코드 문자열로 처리된다.사용 예시wchar_t str[] = L"Hello";  결론 프로젝트가 유니코드와 멀티바이트 설정..

[C++] 폴더 없을 때 폴더 생성
개발공부/C++ 2024. 12. 17. 14:17

폴더 없을 때 폴더 생성 코드 //폴더 없을경우 폴더 작성 if (!PathIsDirectory(strFolderPath)) { // 경로 존재 여부 확인 if (!CreateDirectory(strFolderPath, NULL)) { DWORD dwError = GetLastError(); // 여기에 dwError를 로그로 남김 or 메세지박스로 남김 } }  중간 폴더도 생성하는 재귀 함수bool CreateDirectories(const CString& path) { CString currentPath = L""; int start = 0; while ((start = path.Find(L'\\', start + 1)) != -1) { currentPath ..

article thumbnail
[C++ ] Systemtime : 시스템 시간 날짜 얻어오기
개발공부/C++ 2024. 12. 17. 09:35

Ctime으로는 밀리세컨을 가져올 수 없어 시스템 타임으로 구현했다. SYSTEMTIME이란?SYSTEMTIME은 Windows API에서 날짜와 시간 정보를 나타내는 구조체이다.이를 통해 연도, 월, 일, 시, 분, 초와 같은 세부 날짜 및 시간 데이터를 저장할 수 있다.  SYSTEMTIME 구조체typedef struct _SYSTEMTIME { WORD wYear; // 연도 (예: 2024) WORD wMonth; // 월 (1-12) WORD wDayOfWeek; // 요일 (0-6, 0 = 일요일) WORD wDay; // 일 (1-31) WORD wHour; // 시 (0-23) WORD..

article thumbnail
[C++ MFC] 출력 창에서 디버깅 내용 보기
개발공부/C++ 2024. 12. 4. 16:38

OutputDebugString을 사용해 메시지를 출력한다. CString strMessage; strMessage.Format(_T("rectControl1: LT(%d, %d) RB(%d, %d), point: (%d, %d)"), rectControl1.left, rectControl1.top, rectControl1.right, rectControl1.bottom, ptScreen.x, ptScreen.y); // OutputDebugString을 사용해 메시지 출력 OutputDebugString(strMessage); OutputDebugString(_T("\n")); // 줄바꿈 추가 출력창 단축키는 CTRL + ALT + O 출력예시

[C++ MFC] CTime 클래스 시간 형식 예시
개발공부/C++ 2024. 11. 12. 15:16

CTime 클래스는 MFC(Microsoft Foundation Class) 라이브러리에서 날짜와 시간을 관리하는 데 사용된다.CTime 객체를 특정 형식으로 포맷하려면 Format 함수를 사용하면 된다.(문자열로 변환해 줌) 주요 형식 코드는 다음과 같다.%a : 요일 이름의 축약형 (예: Mon, Tue)%A : 요일 이름 (예: Monday, Tuesday)%b : 월 이름의 축약형 (예: Jan, Feb)%B : 월 이름 (예: January, February)%d : 일 (01 ~ 31)%m : 월 (01 ~ 12)%y : 연도의 마지막 두 자리 (00 ~ 99)%Y : 연도 (예: 2024)%H : 24시간 형식의 시간 (00 ~ 23)%I : 12시간 형식의 시간 (01 ~ 12)%M : 분..

article thumbnail
[C++ MFC] 다이얼로그 창 항상 앞으로 띄우기, 주기적으로 창 앞으로 띄우기
개발공부/C++ 2024. 11. 5. 11:36

다이얼로그 창 항상 앞으로 띄우기 다이얼로그 속성에서 "System Modal" 를 "True""Topmost"를 "True" 로 설정한다.     주기적으로 창 앞으로 띄우기작업자들이 다른 창 띄우고 사용하다가 자리를 뜨면.. 현장에서 사용하는 메인화면을 가리기 때문에 필요했던 기능이다.다른 방법도 있겠지만 난 타이머를 사용해서 구현했다. 1. 헤더에 타이머 타이머에 쓸 define정의#define TIMER_DIALOG_ON_TOP 20241105 2. OninitDialog에 타이머 선언(필요시 여기서 들어가는 5 단위를 에딧박스로 만들면 된다)SetTimer(TIMER_DIALOG_ON_TOP, 5 * 1000 * 60, nullptr); // 5분에 한번씩 주기적으로 타이머 실행1초는 100..

article thumbnail
[Visual Studio c++] region 및 endregion / pragma 코드블럭 지정하기
개발공부/C++ 2024. 9. 27. 15:38

#pragma region에서는 Visual Studio 편집기의 개요 기능을 사용할 때 확장하거나 축소할 수 있는 코드 블록을 지정할 수 있습니다. 구문#pragma region이름 #pragma endregion주석#pragma region 이름#pragma endregion 주석  예시  이렇게 시작할 지점, 종료 지점에 이름과 주석을 각각 표시해 준다. 그럼 이렇게 접을 수 있다!  마이크로소프트에서 제시한 예시 👇// pragma_directives_region.cpp#pragma region Region_1void Test() {}void Test2() {}void Test3() {}#pragma endregion Region_1int main() {}  출처https://learn.micr..