INtime Tech

INtime Top


 RTA의 서비스화에 의한 자동 기동


 

RTA의 서비스화

완성한 RTA는 Windows 서비스에 등록하는 것이 가능하고, 등록을 실시하려면 INtime에 부속되는itwrpsrv.exe 툴을 사용합니다.
상세한 사용 방법은 헬프 파일 또는 itwrpsrv.exe -?커멘드로 확인할 수 있습니다.

서비스 등록

Windows 커멘드 콘솔로부터 다음과 같이 설정합니다.

 "%INTIME%\bin\itwrpsrv.exe" -install "임의의 내부 서비스명"
 -sep "RTA 파일의 패스" -sdn "표시하는 서비스명"
 -sdl "INtimeKernel INtimeIO"

-sdl 옵션은 의존하는 서비스를 지정합니다.이 예에서는 INtimeKernel 서비스와 INtimeI/O서비스가 동작을 위해서 필요한 것을 정의하고 있습니다.의존으로 지정하기 위한 내부 서비스는레지스트리 키 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 로부터 꺼낼 수 있습니다.

서비스 삭제

Windows 커멘드 콘솔로부터 다음과 같이 설정합니다.

 "%INTIME%\bin\itwrpsrv.exe" -remove "내부 서비스명"
 
상기 중다음의 개소는 실제의 문자열에 옮겨놓아 주세요:
  • "임의의 내부 서비스명" ···임의의 내부 서비스명
  • "표시하는 서비스명" ···서비스 애플릿에 표시하는 임의의 서비스명
  • "RTA 파일의 패스" ···RTA 파일에의 절대 패스
    모든 인수는 더블 쿼테이션으로 괄, 반각영숫자로 지정합니다.

어플리케이션의 주의 사항

파일 액세스나 콘솔 입출력을 포함하고 있는 RTA를 자동 기동할 때, INtimeI/O서비스가 초기화중의 단계에서, 어플리케이션 처리가 선행할 가능성이 있어, 이 때문에 자동 기동으로 잘 일하지 않는 타이밍이 있는 것에 주의해 주세요.

어플리케이션 main( )의 빠른 단계에서, INtimeI/O서비스의 기동 완료를 기다리는 코드를 실장하도록(듯이) 추천하겠습니다.

INtimeI/O서비스의 기동 완료를 기다리는 샘플

 /*===================================
     RT노드상에서 가동하고 있을까의 판정
  -----------------------------------
  hRoot      루트 프로세스 핸들
 
   ret:  TRUE    ... RT노드 구성으로 가동
         FALSE   ... OSEM 구성으로 가동
 =====================================*/
 BOOL IsRTnode( void )
 {
     char            cVm86[] = "R?VM86_JOB";
     RTHANDLE        hRoot   = GetRtThreadHandles( ROOT_PROCESS );
 
     if( LookupRtHandle( hRoot, cVm86, 0 ) != BAD_RTHANDLE )
         return TRUE;    // 발견.RT노드이다
     else
         return FALSE;   // 발견할 수 없다.
 }
 
 /*===================================
     INtimeI/O서비스 대기 처리
 =====================================*/
 WORD WaitForINtimeIO( void )
 {
     char ioReq[]    = "RTIOSrvReq";
     char ioRsp[]    = "RTIOSrvRsp";
     char ioSem[]    = "RTIOSrvSem";
     RTHANDLE hRoot  = GetRtThreadHandles( ROOT_PROCESS );
 
     if( IsRTnode( ) == TRUE ){
         /*  RT노드에서는 기다릴 필요가 없기 때문에 스킵 합니다 */
         return( 0 );
     }
     
     while (1){
 
         if ( ( LookupRtHandle( hRoot, ioReq, 0 ) != BAD_RTHANDLE ) 
             && ( LookupRtHandle( hRoot, ioRsp, 0 ) != BAD_RTHANDLE )
             && ( LookupRtHandle( hRoot, ioSem, 0 ) != BAD_RTHANDLE ) )
                 break;
 
         RtSleep(100);
         
     }
     return(0);
 }
 
 
 main( ) {
         :
     // 서비스 자동 기동시:I/O서비스 기동을 기다립니다(main의 빠른 단계에서 실시)
     WaitForINtimeIO();
         :
 }

HOME | INtime