2017-11-29 2 views
0

프로젝트의 일부로 Delphi를 사용하여 Windows NT 서비스를 구현해야합니다. 작업의 복잡성 (그리고 "시스템 문제"에 대한 지식 감소)으로 인해 구현을 시작하기 전에 (프로그램이 완료되었고이 작업 만 대기 중임), 나에게 아이디어를 줄 수있는 모든 사람에게 매우 감사 할 것입니다 주제에.클라이언트 (서버가 아님), OnExecute와 OnStart의 Delphi NT 서비스

내 질문을하기 전에 프로젝트의 성격에 대해 몇 마디 말씀 드리겠습니다. Delphi에서 작성한 것은 NT 이벤트 뷰어 로그를 읽고 다른 곳으로 보냅니다. 이 기능의 자동화로 인해 Windows NT 서비스로 구현하도록 요청 받았습니다. 이 서비스는 모든 종류의 서버 (TCP, SMTP ...)가 아님을 강조해야합니다. 클라이언트로만 제공되며 로그를 읽고 전송합니다. 따라서 (필자는) 다중 쓰레드가 필요 없으며, 다중 쓰레드 프로그래밍이 많은 사람들에게 큰 뼈이기 때문에 나는 이것을 만족 스럽다. 나는이 "일상적인"것을 10 초에서 1 분 사이의 어떤 범위로 돌리고 싶다. 이 조건에서 NT 이벤트 뷰어 레코드를 읽는 작업은 일반적으로 짧지 만 몇 초가 걸리지 만 경우에 따라 서비스가 중지되거나 실패 할 때 길어질 수 있습니다 (1 분 이상) 언젠가는 보내지 않은 기록이 누적되었습니다. 이 후자의 경우 운영자는 현재 전송을 완료 할 때까지 서비스를 중지하지 않도록 설명서에 지시합니다 (최소 종료는 아님). 이것은 업데이트 된 일부 텍스트 디버그 파일에서 볼 수 있습니다.

  1. 비 자문 아주 많이 당신을 감사합니다 "델파이 서비스 응용 프로그램 중지 15초 후, 타이머가 실행되지"

    는이 사이트에 관련된 거의 모든 기사 아래 특히 두 가지를 여러 번 읽고 Tolderlund

  2. TTimer의도 "델파이를 사용하여 서비스 응용 프로그램을 만들기위한 튜토리얼"
  3. 로 두 번째 기사에 대한 핀에 의해 -usage
, 내 질문은

지금 바로이 문서 2에 기반 :

질문 : 내 조건 - OnExecute 솔루션을 사용할 수 있습니까?

나는 내가 생각하기에 내가 할 수 있으면 좋겠다. 나는 멀티 스레딩이 필요 없다. 코드에서 훨씬 더 간단합니다.

안부 알틴

+1

Windows는 이미 이벤트 로그를 다른 대상으로 전달할 수 있습니다. 왜 다시 열어야합니까? – whosrdaddy

+0

필드에서 정보를 추출하여 열로 변환해야하기 때문입니다. 추출은 내가 찾고있는 정보에만 해당됩니다 최고, Altin – altink

답변

2

그대로 떨어져 TService.OnExecute 이벤트에서. SCM 요청에 응답하지 못하도록 서비스 코드를 잘못 작성하고 교착 상태로 만드는 것은 매우 쉽습니다.

작업자 스레드를 시작하려면 TService.OnStart 이벤트를 사용하고 스레드를 종료하려면 TService.On(Stop|Shutdown) 이벤트를 사용하십시오. 스레드는 대상에 대한 연결을 다시 처리하고 필요에 따라 로그 항목을 읽고 + 전달하는 루프를 실행할 수 있습니다.

+0

대단히 감사합니다. Mr. Lebeau! 내 작업이 멀티 스레딩 (적어도 자체적으로)을 요구하지 않는다는 사실, 즉 서버가 없다는 사실로 인해 OnExecute 교착 상태로부터 보호 될 수 있습니까? 또는 OnExecute로 실패하지 않는 방법에 대한 지침? 내 OnExecute에서 절망적 인 경우 OnStart로 어떤 예를 나타낼 수 있습니까? 나는 튜토리얼 감사에서 누락, 완전한 예를 찾아, 또는 일정 기간에 가에 OnExecute 방법을 사용의 위험은 (많은 클라이언트를 제공) 멀티 스레딩의 기능에 구성 수행 알틴 간주 할 수 일? – altink

+0

'TService.OnExecute'를 사용할 때의 문제점은 정기적으로'TService.ServiceThread.ProcessRequests()'를 수동으로 호출해야한다는 것입니다. 대부분의'TService' 초보자들은 그렇게하지 않으며, 왜 그들의 서비스가 SCM에 올바르게 응답하지 않는지 궁금해합니다. 'TService.OnExecute' 핸들러를 지정하지 않으면,'TService'는 내부적으로'ProcessRequests()'를 호출하고, 모든 것은 세계에서 좋다. 그래서 항상'TService.OnExecute' 이벤트를 사용하지 말고 항상 작업자 스레드를 사용한다고 말합니다. –

+0

친애하는 Mr. Lebeau에게 상담해 주셔서 대단히 감사합니다. 어디서 볼지 OnStart 이벤트를 사용하려고합니다. 나는 모든 코드 로직을 런타임에 생성 (릴리스) 될 TDM에 넣을 것이다. 여기에 한 가지 더 질문 하시겠습니까? 위와 같은 방법으로 작업하는 경우 TTimer의 제한 사항 (서비스에서 사용하지 않는 것이 더 정확함)은 계속 유지됩니까? 이 방법을 사용하면 OnStart 및 OnStop 이벤트에 간단한 DM 작성/FreeAndNil을 가질 수 있기 때문에이 질문을하고 있습니다. 일반적인 TTimer로 DM에 "정상적인"Delphi 작업을 수행합니다. 그리고 당신은 별도의'TDataModule' 필요하지 않습니다 – altink

관련 문제