728x90

가상 그래픽 드라이버 외주 개발자가 만들어준 드라이버가 SwDeviceCreate()와 SwDeviceClose()를 호출하다가 일정 횟수를 반복하다보면 그래픽 드라이버가 제대로 만들어지지 않는 현상을 발견하였다.

Debuging을 해보니 DirectX 자원을 생성하려고 할때 E_OUTOFMEMORY 가 발생하는거였다.

하지만 이것도 IGPU, AMD는 괜찮지만 NVIDIA에서만 발생한다.

그래서 NVIDIA Memory leak을 검색하다보니 flush()를 하면 괜찮다는 글을 발견하였다.

그렇다면 DX Resource를 Release할 때 AMD와 IGPU는 바로 해제를 하지만 NVIDIA는 Flush가 발생할때까지 command list에 쌓아두기만하다가 한번에 처리하는건 아닐까? 생각이 든다.

 

참조 : https://forums.developer.nvidia.com/t/create-texture-cause-memory-leak/50121

 

create texture cause memory leak

Repeat to create texture and release, it will lead to a memory leak. https://devtalk.nvidia.com/default/topic/911464/graphic-driver-memory-leak/#4784574 #include "stdafx.h" #include <direct.h> #include <dxgi.h> #include <d3d11.h> #include <stdio.h> #includ

forums.developer.nvidia.com

 

참조 : https://stackoverflow.com/questions/58726052/directx-11-createvertexshader-memory-leak

 

728x90
728x90

Framework에서 기본적인 Sleep()을 주다보니 정확하지 않은 시간동안 잠들었다가 깨어나기 때문에 발생하는 frame loss라던가 정확한 latency 측정이 되지 않아서 정확하게 지정된 시간동안 잠들었다가 깨어나는 Sleep()을 찾게되었다.

 

동작에 대해 간단히 설명하면 Sleep(16)을 원한다면 Sleep(15)를 하고 남은 1ms은 while()을 돌면서 대기하는 방식이다.

 

참고 : https://blat-blatnik.github.io/computerBear/making-accurate-sleep-function/

 

Making an accurate Sleep() function | computerBear

There are many cases in programming where I wish the system Sleep() function was more accurate. Real-time rendering immediately comes to mind, as do animated GUI’s. In both of these cases you want some piece of code to run on a fixed timer, executing pre

blat-blatnik.github.io

 

728x90
728x90

1. 아래의 사이트에서 회원 가입을 한다.

https://developer.microsoft.com/en-us/dashboard/hardware

 

Sign in to your account

 

login.microsoftonline.com

 

2. 가입 후 로그인을 하고 Setting → Account Setting 으로 가면 아래와 같은 화면이 나온다.

 

3. 하드웨어 시작하기를 누르면 아래와 같이 나온다.

 

4. 다음을 누른 후 계정 세부 정보를 입력한다.

 

5. 다음을 누르면 아래와 같은 화면이 나온다.

6. 다음을 누르면 아래와 같은 화면이 나온다.

 

7. 이미 받아놓은 서명파일을 등록하고 다음을 누른다.

 

위와 같이 나오면 개발자 등록은 완료된 것이다.

 

참고 : https://rms.ne.jp/codesigning/support/register-for-the-hardware-program/

 

SSL/TLSサーバ証明書、コードサイニング証明書 | 国内最安値DigiCert(デジサート)正規代理店

RMSは、2008年よりDigiCertの各種証明書取り扱う正規代理店です。SSL/TLSサーバ証明書(SSL、ワイルドカードSSL、マルチドメインSSL、EV SSL)、コードサイニング証明書など取扱い実績は国内最長で

rms.ne.jp

 

728x90
728x90
728x90
728x90

이번에 개발한 프로그램이 윈도우 시작시 실행이 되어야 하는데, 레지스트리에 등록을 해서 실행을 하니 관리자 권한이 필요한 프로그램이라 실행이되지 않았다.

 

그래서 작업 스케줄러에 등록하는 방법으로 하였다.

 

trigger를 BootTrigger로 줘야만 부팅 후 LockWorkStation 상태에서 프로그램이 켜질 줄 알았는데, LogonTrigger로 줘도 무방했다. BootTrigger를 주면 오히려 프로그램이 제대로 동작하지 않는 현상이 발생했다.

class WindowsAutoStarter
{
    private const string kTASK_SCHEDULER_NAME = "My App";
    public static void SetAutoStart(bool enable)
    {
        TaskService taskService = new TaskService();
        TaskDefinition taskDefinition = taskService.NewTask();

        if (enable)
        {
            // trrigger
            taskDefinition.Triggers.Add(new LogonTrigger());
            //taskDefinition.Triggers.Add(new BootTrigger());

            // general
            taskDefinition.Principal.DisplayName = "ProgramName";
            taskDefinition.RegistrationInfo.Description = "blahblah";
            taskDefinition.Principal.UserId = string.Concat(Environment.UserDomainName, "\\", Environment.UserName);
            taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
            taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;

            // condition 
            taskDefinition.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
            taskDefinition.Settings.DisallowStartIfOnBatteries = false;
            taskDefinition.Settings.StopIfGoingOnBatteries = false;
            taskDefinition.Settings.AllowHardTerminate = false;
            taskDefinition.Settings.StartWhenAvailable = false;
            taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
            taskDefinition.Settings.IdleSettings.StopOnIdleEnd = false;
            taskDefinition.Settings.IdleSettings.RestartOnIdle = false;

			// setting
            taskDefinition.Settings.AllowDemandStart = false;
            taskDefinition.Settings.Enabled = true;
            taskDefinition.Settings.Hidden = false;
            taskDefinition.Settings.RunOnlyIfIdle = false;
            taskDefinition.Settings.ExecutionTimeLimit = TimeSpan.Zero;
            taskDefinition.Settings.Priority = System.Diagnostics.ProcessPriorityClass.High;

            // operate
            taskDefinition.Actions.Add(new ExecAction(Application.ExecutablePath));

			// registration
            taskService.RootFolder.RegisterTaskDefinition(kTASK_SCHEDULER_NAME, taskDefinition);
        }
        else
        {
        	Microsoft.Win32.TaskScheduler.Task t = taskService.GetTask(kTASK_SCHEDULER_NAME);
            if (t != null)
            	taskService.RootFolder.DeleteTask(kTASK_SCHEDULER_NAME, true);
        }
    }
}

 

 

출처 : https://neofirst.tistory.com/346

728x90

'Basic Programming > C#' 카테고리의 다른 글

C# - Steam Game 실행하기  (0) 2020.07.21
C# - Dispose  (0) 2018.10.12
C# - WeakReference  (0) 2018.10.11
C# - 공부하기 좋은 사이트  (0) 2018.09.05
C# - Attibute  (0) 2018.07.09
728x90

이번에 개발한 프로그램이 서비스로 동작해야되는 상황이와서 검색하다보니 이미 잘 구현해놓은게 있어서 갖다쓰니 되었다.

1.예제로 쓸 프로그램을 준비한다.즉 서비스로 돌릴 프로그램이 있어야한다.

-멀티쓰레드기반의 파일 전송서버를 예로 들겠다.

 

2.서비스클래스를 원래의 프로그램에 추가한다.

서비스 모듈인 Service.cpp와 Servie.h라는 파일을 추가한다.

 

3.코딩은 생각보다 아주 간단하다.

/*

원프로그램 제작자
(Author :- Nish [BusterBoy] EMail :- nishinapp@yahoo.com)

 

서비스프로그램화 : 자작
*/

#include "stdafx.h"

#include "MTServer.h"
#include <tchar.h>
#include "Service.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CWinApp theApp;
SOCKET server;

using namespace std;

UINT  MTServerThread(LPVOID pParam);
UINT  ClientThread(LPVOID pParam);
BOOL ParseCmd(char *str, CString& cmd, CString& params);
BOOL SendFile(SOCKET s, CString fname);


class CUpdateService: public CService
{
public:
 VOID Main(void) 
 {
  CService::Begin(_T("UpdateServer"));//내부에서 OnStarted호출
  CService::End(); //내부에서 OnStopped호출
 }
protected:
 void OnStarted()//서비스 시작시 동작할 쓰레드나 타이머
 {
  AfxBeginThread(MTServerThread,0);
  
 }
 void OnStopped()//서비스가 멈추었을 때 해제코드
 {
  closesocket(server);
  WSACleanup();
 }

};


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

//원 소스에서 주석처리한 부분
 /*int nRetCode = 0; 

 cout << "Press ESCAPE to terminate program\r\n";
 AfxBeginThread(MTServerThread,0);
 while(_getch()!=27);

 closesocket(server);
 WSACleanup();

 return nRetCode;*/

 

 CUpdateService upServ;
 if(argc == 2)
 {
  if(_tcscmp(argv[1],_T("-i")) == 0)//서비스 설치
  {
   upServ.Install(_T("UpdateServer"));
  }
  else if(_tcscmp(argv[1],_T("-u")) == 0) //서비스 제거
  {
   upServ.Uninstall(_T("UpdateServer"));
  }
  return TRUE;
 }

 upServ.Main();

 return TRUE;
 
}


UINT  MTServerThread(LPVOID pParam)
{

.....중략 //파일을 다운받아서 보자.서비스와 관련하여 그렇게 중요한 내용이 없다.  
}

 

4.서비스 프로그램 설치

 

(1)빌드를 하면 실행파일이 만들어지는데,위의 예제에서는 서비스이름이 UpdateServer니까

폴더도 UpdateServer로 만들고 거기에다가 실행파일을 두자.

만약에 환경설정파일(INI파일,이미지등등이 필요하다면 여기에 다 담아야한다.)

그리고 이 폴더 내에는 텍스트파일을 열어 확장자만 바꾼 install.bat과 uninstall.bat을 준비한다.

 

위 프로젝트의 실행파일은 MTServer로 되어 있다.(물론 프로젝트 설정으로 바꿀 수 있다.)

install.bat이라는 파일은 MTServer.exe -i 라고 적고(설치배치파일)

uninstall.bat에는 MTServer -u 라고 적는다.(제거배치파일)

 

(2)이렇게 만들어진 UpdateServer폴더를 Windows 혹은 WINNT 아래에 있는 System32폴더에 복사해 넣자.

주의:다른 폴더에 두어도 상관없지만,다른 폴더에 두는 경우에 환경설정파일이나 이미지파일은 절대경로로 설정하는 것이 좋다.

본인이 경험한 결과 서비스프로그램의 상대경로의 시작지점이 System32이라는 것을 알게되었다. 

 

(3)이제 install.bat을 누르면 서비스가 등록된다.

(4)시작을 하려면 제어판 -관리도구 -서비스 로 들어가면 반갑게 UpdateServer라는 서비스가 만들어져 있을 것이다.

(5)서비스를 시작한다.제대로 프로그레스바가 진행되고 시작하면 제대로 된 것이다.

 

5.테스트

(1)텔넷으로 서버에 접속해보자.

실행에서 다음과 같이 입력하고 엔터클릭

telnet 127.0.0.1 20248

 

(2)서버접속 메시지 수신으로 서비스가 정상적으로 동작한다는 것을 알 수 있다.

 

ServiceSample.zip
0.02MB

 

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bmk5133&logNo=80090120069

 

C++ 서비스 프로그램 제작

1.예제로 쓸 프로그램을 준비한다.즉 서비스로 돌릴 프로그램이 있어야한다. -멀티쓰레드기반의 파일 전송...

blog.naver.com

 

728x90
728x90

https://github.com/m-ab-s/media-autobuild_suite

 

GitHub - m-ab-s/media-autobuild_suite: This Windows Batchscript helps setup a Mingw-w64 compiler environment for building ffmpeg

This Windows Batchscript helps setup a Mingw-w64 compiler environment for building ffmpeg and other media tools under Windows. - GitHub - m-ab-s/media-autobuild_suite: This Windows Batchscript help...

github.com

위 사이트에서 다운로드 받은 다운 받는다.

그리고 media-autobuild_suite.bat을 실행한 다음 필요한 코덱들을 선택해서 넣어준다.

혹시 헷갈리는 부분이 있으면 아래의 ini와 비교하면서 넣어도 된다. 

ini의 위치는 build 폴더에 생길 것이다.

media-autobuild_suite.ini
0.00MB

728x90
728x90
728x90

'좋은 사이트' 카테고리의 다른 글

사이트 - Hooking  (0) 2021.01.19
사이트 - Vulkan 강좌  (0) 2020.10.25
사이트 - wxWidget  (0) 2017.09.04
사이트 - DirectX 강좌  (0) 2016.04.19
사이트 - MS에서 제공하는 무료 서적 사이트  (0) 2016.03.07

+ Recent posts