듀얼 모니터를 사용하면서, 최근에 모니터를 바꾸어 DP 포트에 연결하였습니다.
자리를 비우면 화면 보호기 > 모니터 끄기 이렇게 동작하도록 보통 설정하는데요
잠근 화면을 풀고 모니터가 켜지면 모든 윈도우가 주 모니터로 다 모여 있네요.

DP 포트의 버전과 케이블 특성을 탄다고 되어있는데, 결론적으로 DP 포트로 연결된 모니터는 전원옵션에서 자동으로 꺼지면 하드웨어가 없어진 상태로 감지되고, 절전에서 깨어날 때 다시 모니터가 연결되는 그런 문제라고 하네요.
(그렇다고 모니터를 끄기를 없애면 계속 켜져있어서 문제 ... DP 포트 안쓰면 자동 해결)

그 과정에서 모니터가 없어졌다가 나타나니 윈도우가 한 모니터에 몽땅 뭉처져서 보여지네요.

1. 평상시 듀얼 모니터 상태

2. 모니터가 절전모드에서 DP 포트에 연결된 놈이 꺼지는 상태 (이 때 화면에 한 모니터로 다 몰림)

3. 절전 모드에서 잠금 풀었을 때 화면

이 문제는 하드웨어적인 특성을 가지고 있다고 하는데, S/W 개발자다 보니 S/W 적인 방법으로 풀어 보았습니다.
4. 화면이 잠금 될 때 모든 모니터의 윈도우 정보를 몽땅 저장한다.
5. 잠금 해제되어 모니터가 모두 연결 되었을 때, 저장된 윈도우 정보를 복원하여 원래 대로 위치 시킨다.

그러면 3번의 화면이 아래 그림처럼 바뀌어 원하는 결과를 얻을 수 있습니다.

6. 작성된 첨부 프로그램 (윈도우 서비스 레이어에서 구동되는 서비스 프로그램)

DesktopPositionSrv.zip
0.02MB

해당 프로그램은 윈도우 서비스로 구동되는 데몬 같은 프로그램입니다.
7. C 루트에 파일 압축을 풀어 놓습니다.
    (원하는 어떠한 경로에 복사해 두어도 됩니다. 설명을 위하여 C 에 복사함)

8. CMD 창을 관리자 모드로 열고 C:\ 로 이동합니다.

9. 서비스 인스톨 명령을 실행합니다.
    C:\>DesktopPositionSrv.exe i 를 입력하고 엔터

10. 서비스 실행 명령을 실행합니다.
  C:\>DesktopPositionSrv.exe s 를 입력하고 엔터

11. 서비스를 중지할 때는 C:\>DesktopPositionSrv.exe t
12. 서비스를 제거할 때는 C:\>DesktopPositionSrv.exe u

13. 프로그램이 정상적으로 구동되면 아래 처럼 작업 관리자 및 서비스 관리자에 보여집니다.


14. 이제 모니터가 절전 모드에 들어갔다 나와도, 잠금을 해제하면 원래 위치로 가있는 화면을 보실 수 있습니다.
15. 윈도우 서비스 프로그램이기 때문에 컴퓨터가 꺼졌다 켜저도 자동으로 동작합니다.
      (모니터 잠금(백업) 및 잠금해제(복원)시에만 동작하며 접속 터미널이 콘솔일 경우만 반응합니다.)

안녕하세요. 까막입니다.   
조금 오래된 자료들의 링크가 많이 깨져있어서, 자료 복구를 시작하였습니다.
(확인해보니 링크가 깨졌어도, 마우스 우클릭하셔서 다른이름으로 저장하기 하면 받아 지네요.)

 

 

안녕하세요. 까막입니다.
지난 포스팅에 이어 MSVS 2013 -> MSVS 2019 로 개발 환경을 옮기면서 발생한 2번째 문제입니다.

해당 환경에서 MSVS 2019 로 옮기면서 컴파일러 버전 업 및 옵티마이저 이득을 약간 얻고자 + 
MSVS 2013 기술지원이 종료되었는지 업데이트도 않되고 해서 변경을 진행했습니다.

현상
전체 빌드 프로젝트가 좀 크고 여러개여서 인지는 모르겠지만 전체 빌드 혹은 덩치 큰 플젝 빌드할 경우
윈도우가 파란 화면을 뛰우는 경우가 자주 발생하더군요.

관련 글들
https://developercommunity.visualstudio.com/t/multiple-times-a-day-a-blue-screen-when-working-in/274372

 

multiple times a day a blue screen when working in VS ...

We have 6 identical HP Z440 workstations with a Intel XEON E5-2630 V3 and 64 GB memory in our company for the developers we use all visual studio 201...

developercommunity.visualstudio.com

https://docs.microsoft.com/en-us/answers/questions/342963/visual-studio-2017-crashes-after-every-run-into-a.html

 

Visual Studio 2017 crashes after every run into a blue screen of death - Microsoft Q&A

 

docs.microsoft.com

결론
위와 관련된 자료들을 취합하여 여러가지 방법을 수행하여 보았으나 
최종적으로 윈도우의 페이징 파일을 자동 관리에서, 요청 크기 2배 이상으로 늘린 후 더 이상 현상이 발생하지 않네요.

결론적인 내용이지만 툴이 빌드할 때 페이징 파일을 사용하는지 생각보다 크게 늘어 있었구요
자동 확장되면서 무슨 문제가 생기는게 아닌가 라는 그런 의심만 남은 상태입니다. 

저같은 경우는 자동 상태에서 약 11GB 쓰고 있었는데, 40 GB로 확 늘려 버린 이후로는 약 1주일째 현상이 없네요.

 

PS. 조금 오래된 글들에 첨부된 이미지와 파일들이 모두 깨져 있네요.
       참고 자료 형태로 글을 남기는 곳인데, 저렇게 다 깨져 있어서 ㅡㅜ 
       시간이 될 때 마다, 조금씩 복구 해 보도록 하겠습니다. 

 

안녕하세요. 까막입니다.
오랜만에 글을 남기네요.

C++ 에서 싱글톤 패턴을 적용하여 인스턴스를 생성할 때, 인스턴스가 리턴되지 않고
무한 대기(내부적으로는 아래 설명에 따라 무한 루프)에 빠지는 문제에 대한 내용입니다.
이 문제는 Visual Studio 2015 (c++ 11 포함 이상)부터 상위 버전에서 발생할 수 있는 문제라고 되어 있네요.

 

싱글톤에 대한 간략한 설명 
https://boycoding.tistory.com/109

 

C++ 디자인 패턴 05. 싱글턴 패턴, Singleton Pattern

싱글턴 패턴, Singleton Pattern 오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다. (GoF의 디자인 패턴 181쪽) GoF의 싱글턴 패턴은 의도와는 달리 득보다는

boycoding.tistory.com

 

MSDN
https://docs.microsoft.com/en-us/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization?view=msvc-170 

 

/Zc:threadSafeInit (Thread-safe Local Static Initialization)

Learn more about: /Zc:threadSafeInit (Thread-safe Local Static Initialization)

docs.microsoft.com

 

비슷한 현상
https://forum.juce.com/t/calling-my-singleton-causes-eternal-loop-in-init-thread-header/37340

 

Calling my singleton causes eternal loop in _Init_thread_header

Hi there, I’m experiencing issues with one of my singletons, which I assume is related to threads somehow (pardon my modest knowledge of C++ and multithreading). This is what my function looks like: SettingsManager& SettingsManager::getInstance() { stati

forum.juce.com

 

겪은 현상 설명
최근 Visual Studio 2013 버전에서 Visual Studio 2019로 마이그레이션을 진행하면서 겪은 내용을 남겨 놓고자 글을 씁니다.
싱글톤을 리턴할 때 MSDN에서는 스레드 세이프하도록 가드를 넣었다고 설명하고 있습니다.
(아래 그림이 첫번째 인스턴스를 생성할 때, 가드를 치는 c runtime 내부 소스입니다.)

/Zc:threadSafeInit(스레드로부터 안전한 로컬 정적 초기화) - MSDN 설명중 일부 발췌
/ Zc:threadSafeInit 컴파일러 옵션은 컴파일러에게 스레드로부터 안전한 방식으로 정적 로컬(함수 범위) 변수를 초기화하도록 지시하므로 수동 동기화가 필요하지 않습니다. 초기화만 스레드로부터 안전합니다. 다중 스레드에 의한 정적 지역 변수의 사용 및 수정은 여전히 수동으로 동기화되어야 합니다. 이 옵션은 Visual Studio 2015부터 사용할 수 있습니다. 기본적으로 Visual Studio는 이 옵션을 활성화합니다.

즉, 위의 내용은 싱글톤을 패턴을 포함한 정적 로컬 변수의 초기화시 안정성을 보장하는 옵션에 대한 설명이며
Visual Studio 2015 부터는 기본 옵션으로 포함되어 있습니다.

멀티 스레드 환경에서도 정적 변수 초기화시 별다른 lock 없이 사용할 수 있도록 보장하는 내용이지요.
그게 아니라면 별도로 lock 을 걸어서 안정성을 보장해 주어야 합니다.

최근 테스트된 환경에서 고속으로 돌아가는 개별 스레드에서 싱글톤 객체를 생성할 때, 초기화 코드를 호출하고
해당 코드가 리턴되기 전에 다른 스레드에서 또 객체 생성을 호출하면 위 그림의 while 루프에 빠져 무한 루프를
도는 현상이 확인 되었습니다.

통상적으로 코드 자체에는 문제 없고, 로직이나 이런것에 전혀 문제가 없는 상황에서 발생하는데요
이번에 확인된 부분은 콘솔 터미널 에서는 문제없이 돌아가는 실행파일이, 리모트 터미널 환경에서 hang 걸리는 
극악한 환경에서 발생해서 원인을 찾는데 상당히 애를 먹었네요.

아마도 리모트 환경에서는 콘솔에 비하여 바이너리 로딩이나 초기화 등에서 조금더 지연이 발생 하나 봅니다.

해법은 컴파일러 옵션에서 /Zc:threadSafeInit- 옵션을 넣어서 간단하게 해결할 수 있습니다.
즉, 기본옵션인 /Zc:threadSafeInit 를 강제로 해제하는 내용입니다.

이런 경우 해당 객체의 스레드 안정성은 직접 보장해 주시거나, 기존 동작에 문제가 없었다면 옵션만 넣고 빌드하시면 됩니다.

해당 자료를 검색하고, 해결하는 과정에서 작업이 끝나고 보니 아래 자료에 도움될만한 내용이 있었네요.
https://www.slideshare.net/utilforever/c-korea-3rd-seminar-c-visual-studio

 

[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기

C++11을 시작으로 모던 C++이 도입된 지도 어느새 6년이라는 시간이 흘렀습니다. 올해는 C++17 표준이 도입될 예정입니다. 그만큼 많이 개선되고 새로운 기능들이 많이 도입되었기에 실무에서 사용

www.slideshare.net

 

MFC 버전이 업그레이드 되면서, 예전 방법을 찾아서 프레임 배경에 이미지를 깔아보려고 했으나 구조가 변경되었는지 안먹네요. 지금 MSVS 2017로 작업 중 입니다...

아주 간단하게 작성해서 바로 써먹을 수 있는 예제를 하나 올립니다.


새로운 MFC 프로젝트를 생성합니다.


MDI 기본 구성으로 설정하고, Finish~


배경으로 사용할 이미지 입니다.


프로젝트 리소스에 이미지를 추가합니다. 이름은 IDB_BITMAP_BACK 으로 하였습니다.


CMainFrame 에 변수를 하나 선언합니다.

CBitmap m_bmp;


그리고, CMainFrame 의 OnCreate 에 코드를 한 줄 추가합니다. 

m_bmp.LoadBitmap(IDB_BITMAP_BACK);

CMainFrame 에 WM_PAINT 이벤트 핸들러를 추가하고, 아래와 같이 코드를 작성합니다.

void CMainFrame::OnPaint()
{
    CPaintDC dc(this);

    if (m_bmp.m_hObject)
    {
        BITMAP bm;
        CDC dcMem;

        CDC* pDC = m_wndClientArea.GetDC();
        VERIFY(m_bmp.GetObject(sizeof(bm), (LPVOID)&bm));

        dcMem.CreateCompatibleDC(pDC);
        CBitmap* pOldBMP = (CBitmap*)dcMem.SelectObject(&m_bmp);

        CRect rect;
        m_wndClientArea.GetClientRect(rect);

        pDC->FillSolidRect(rect, RGB(128, 128, 128));

        pDC->BitBlt((rect.right - bm.bmWidth) / 2,   // centered
            (rect.bottom - bm.bmHeight) / 2,
            bm.bmWidth,
            bm.bmHeight,
            &dcMem,
            0, 0,
            SRCCOPY);

        dcMem.SelectObject(pOldBMP);

        ::ReleaseDC(m_wndClientArea.m_hWnd, pDC->m_hDC);
    }
}


마지막으로 아래처럼 메인프레임 화면이 갱신될 때 MFC 내부에 정의된 배경을 관리하는 클라이언트도 함께 갱신하는 코드를 한 줄 넣어줍니다.

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_PAINT)
    {
        if (pMsg->hwnd == m_hWndMDIClient)
            Invalidate();
    }
    ...

    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}


이제 실행해 보시면, MDI 에서 차일드 창이 하나도 없는 상태일 때 아래 그림처럼 배경에 이미지가 깔립니다.











요즘 회사에서 서브잡으로 개발하고 있는 프로그램 입니다.

비행 시뮬레이션 중에 DCS World 라고 하는 게임이 있는데, 해당 시뮬레이션을 보조하는 
모바일 계기판의 PC 연동 서버 정도로 보시면 되겠네요.

그 중에 서버 모듈을 개발하고 있는데, CDU가 참 복잡하군요... -_-;

 

A10C Warhog 의 CDU 와 AMPCD 화면 (게임 캡처)

CDU 정보를 Export 하고 해당 정보를 수집하여 분석하는 서버 (디버그 모드 상태)

익스포트된 정보를 분석하여 시각적으로 출력하는 디버깅 창

약간의 기술 + 노가다 만빵 작업이긴 하지만 오랜만에 색다른 작업이라.. ^^;~


안녕하세요. 까막임돠.


신규 VM 서버를 구축하면서 Windows 2016 서버에 셑팅하게 되었네요.

2016, 2012, 2008 까지는 별다른 무리없이 guest os 를 잘 설치하였는데...


2003 서버를 설치하는 과정에서 OS 를 다 설치한 후 마우스 캡처가 않되더군요.

(뿐만 아니라 장치 디바이스들도 못잡아서 네트워크도 않됩니다.)

이전 버전 Hyper-V 에서는 Action 메뉴에 해당 서비스 인스톨 메뉴가 있었는데

2016 서버에는 없습니다.


해당 문제를 해결하는 과정을 거치면서 진행된 절차를 정리해 보겠습니다.


1. Windows Server 2003 은 SP2 로 업데이트 해야 합니다.

2. 주변의 Windows Server 2012 혹은 2008 서버를 찾아서

3. Windows\vmguest 폴더를 찾습니다.

4. 해당 폴더를 통째로 ISO 로 만들어 VM 구축 서버에 복사합니다.

  (혹은 인터넷에서 떠도는 vmguest.iso 다운 받으셔도 되겠습니다.)

5. guest os 에 이미지로 삽입하고, Integrated services 를 설치합니다.

6. 각종 장치들을 잡고나면 끝~

7. 추가로, Windows Update 는 IE 7을 다운 받아서 수동으로 설치후, 업데이트 진행.

8. Settings 에서 동적 메모리로 하지 마시고 고정 메모리로 해야하는 군요.

  (동적 메모리로 설정하면 사용중에 메모리가 한번에 풀 나버리는 버그가 있는듯 해요.)


Visual Studio 6.0을 Windows 8 64bit 이상에서 설치하려면 여러가지 문제가 발생하더군요

그러한 부분을 해결하기 위한 팁을 정리해 봅니다.


1. Run : Windows\SysWow64\cmd.exe (32 bit cmd)


2. change directory setup path


3. Run : setup.exe


4. Change option 1


5. Change option 2


6. Install Complete


7. Install service pack 6 ... complete


8. Extract VS6sp61.cab file (exists in SP6 unpacked folder)



9. Copy and overwrite common folder -> VS6 Install path ....\Common


10. go VS6 Install path ... Common\MSDev98\Bin


11. run msdevP.exe or msdevS.exe (compatibility setting)



12. build project ... bla bla bla ....




안녕하세요. 까막임돠~


Microsoft Visual Studio 를 이용하여 프로젝트를 생성하면, 프로젝트 폴더에

각종 더미성 파일들이 생성되지요.


이러한 파일이나 폴더를 한쪽에 몰아서, 소스 폴더를 깔끔하게 관리하는 방법은

인터넷에 많이 있는데, 가끔 까먹어서 자료로 남겨 봅니다.


아래는 MSDN을 참조하여, 파일 확장자 및 내용에 대한 정리를 한것 이구요.


주황색 비끄무리한 색은 아래 방법으로 처리합니다.

폴백 경로를 지정하지 않으면 %TEMP% 경로에 저장되구요, 물리 경로를 지정하면 해당 경로에 생성됩니다.


녹색 비슷한 색은 아래 방법으로 처리합니다.

Configuration 별로 모두 설정해야 합니다. 경로는 원하는 경로에 몰아서 처리 해주시면 됩니다.

(아래의 예시 경로는 다수의 프로젝트가 다중 depth 로 있어서, 상대 경로로 처리해준것 입니다.)

(상대 경로, 절대 경로 모두 사용할 수 있습니다.)


프로젝트를 위와 같은 방법으로 정리하면, 디버깅관련 파일과 각종 OBJ 파일들이 몽땅 다른 곳에 저장되기 때문에

프로젝트 폴더에는 빌드에 꼭 필요한 파일만 남게되어 소스관리툴 등과 연동할 때 편리합니다.



PS. 만약에 실행파일만 다른 경로에 모아서 관리하고 싶다면 다음과 같은 설정을 해주셔야 합니다.

우선 링커 옵션에 Output File 에 실행파일 경로을 넣어주시고요. (물론 Configuration 별로 다 해주셔야 하지요.)


실행파일 경로를 옮기면 디버거가 해당 위치를 못찾을 수 있기 때문에, 아래와 같이, 변경된 경로를 적어 주셔야 합니다.


+ Recent posts