소연의_개발일지
[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
[Python] PyQt로 제작한 파일 exe파일로 만들기
개발공부/Python 2024. 12. 11. 09:09

python PyQt 파일 exe로 저장하기 1. PyInstaller 설치먼저, PyInstaller를 설치해야 한다. 터미널 또는 커맨드 프롬프트에서 아래 명령어를 입력하여 설치한다.pip install pyinstaller 2. .ui 파일을 .py 파일로 변환PyQt5 UI 파일(.ui)을 Python 코드로 변환하려면 pyuic5 도구를 사용해야 한다.pyuic5 -o mainUI.py ExceltoCSV.uiExceltoCSV.ui 파일을 Python 파일 mainUI.py로 변환하는 명령어이다. 3. PyInstaller로 EXE 파일 만들기이제 Python 코드 (main.py, mainUI.py, convert_to_csv 함수 등)를 EXE 파일로 변환할 수 있다. 터미널 또는 커맨드 ..

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..