2013-07-25 47 views
2

阅读了这个问题: Delphi Windows Service Design,我看到大部分的设计师在TServiceOnExecuteTThread方法如下使用此代码,以保持服务活着。德尔福服务听TCP或UDP

while not Terminated do 
begin 
    // do something 
end; 

但是,如果我需要(和我一样)来创建一个服务(使用印),以便发回一些认证数据由主应用程序发送的消息做出反应,我该怎么办这个代码是什么,忽略它还是放一些Sleep()呢?

+2

你并不需要实现'TService'类的'OnExecute'事件的方法。这是可选的。 – TLama

+4

TLama是对的。最好不要使用OnExecute事件。您应该将该逻辑移动到一个单独的工作线程,该线程在'OnStart'事件中启动,并在'OnStop'事件中终止。如果'OnExecute'完全不分配,'TService'会为您SCM请求做出响应。但是,如果'OnExecute'分配,你有责任()'手动调用'ServiceThread.ProcessRequests和服务将停止本身时候'OnExecute'退出。 –

回答

7

Indy的TIdTCPServerTIdUDPServer组件是多线程的,所以您根本不需要使用TService.OnExecute事件。你可以只激活它们TService.OnStart事件,并在TService.OnStop事件禁用它们,然后根据需要分配处理器的TIdTCPServer.OnExecuteTIdUDPServer.OnUDPRead事件。这两起事件已经对循环你,所以你不需要在他们while not Terminated循环。只需根据需要读取/处理一个请求,然后退出,然后等待下一个事件重复。让服务器处理引发的任何异常。而且要记住,TIdUDPServerThreadedEvent属性,默认为false,所以你应该把它设置为True一个服务里面。

+0

我应该使用UDPRead上的'AThread:TIdUDPListenerThread;'指向另一个函数来启动,而不是在UDPRead内编码吗?有什么不同? – PSyLoCKe

+0

我不明白你在问什么。 'AThread'参数只是指定哪个内部线程正在接收数据。它主要仅用于访问'TIdUDPListenerThread.Server'和'TIdUDPListenerThread.Data'属性。 'ABinding'参数指定接收数据的'TIdUDPServer.Binding'套接字,因此您可以从中获取对等信息,并将回复发回到同一套接字上。无论您是直接在OnUDPRead事件处理程序中编写逻辑还是委托给其他函数,都取决于您。 –