📄 cb199910nt0602_f.asp.htm
字号:
Separate Thread for the Service</p>
<p class=BodyText> You can
use the service's built-in service thread for simple services. For other types
of services, you probably want to spawn a separate thread to execute the
service's code. Whether or not you do this depends largely on what the service
does. If, for example, the service is expected to handle multiple client
requests, then you may want a separate thread for each client request. </p>
<p class=BodyText> </p>
<p class=BodyText> You
should also use a separate thread for your service if your service performs
lengthy startup tasks. The SCM allows two minutes for a service to start. The
SCM instructs the service to start and then waits for a response from the
service. If the response doesn't come back within two minutes, NT assumes that
the service is hung and kills the service process. If your startup tasks will
take longer than two minutes, you should spawn a separate thread to perform the
startup tasks. This frees the service thread to handle service requests from
the SCM. </p>
<p class=BodyText> </p>
<p class=BodyText> Figures
5 and 6 show a modified beep service called BeepSrvcThread. This version of the
beep services uses a separate thread to handle the service's code. </p>
<p class=BodyText> </p>
<p class=Code><span class=Code><span Class=CodeGrn>#ifndef
BeepServiceThreadUH</span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#define
BeepServiceThreadUH</span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
<SysUtils.hpp> </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
<Classes.hpp> </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
<SvcMgr.hpp> </span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>class</b>
TBeepThread : <b>public</b> TThread {</span></p>
<p class=Code><span class=Code> <b> public</b>:</span></p>
<p class=Code><span class=Code> <b> virtual</b>
<b>__fastcall</b> <b>void</b> Execute();</span></p>
<p class=Code><span class=Code> <b> __fastcall</b>
TBeepThread(<b>bool</b> CreateSuspended); </span></p>
<p class=Code><span class=Code>};</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>class</b>
TBeepServiceThread : <b>public</b> TService</span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code><b>__published</b>: <i> <span Class=CodeBlue>// IDE-managed Components</span></i></span></p>
<p class=Code><span class=Code> <b> void</b>
<b>__fastcall</b> BeepServiceThreadStart(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Started); </span></p>
<p class=Code><span class=Code> <b> void</b>
<b>__fastcall</b> BeepServiceThreadStop(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Stopped); </span></p>
<p class=Code><span class=Code> <b> void</b>
<b>__fastcall</b> BeepServiceThreadPause(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Paused); </span></p>
<p class=Code><span class=Code> <b> void</b>
<b>__fastcall</b>
BeepServiceThreadContinue(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Continued); </span></p>
<p class=Code><span class=Code><b>private</b>: <i> <span Class=CodeBlue>// User declarations</span></i></span></p>
<p class=Code><span class=Code> TBeepThread* BeepThread; </span></p>
<p class=Code><span class=Code><b>public</b>: <i> <span Class=CodeBlue>// User declarations</span></i></span></p>
<p class=Code><span class=Code> <b> __fastcall</b>
TBeepServiceThread(TComponent* Owner); </span></p>
<p class=Code><span class=Code> PServiceController <b>__fastcall</b> GetServiceController(<b>void</b>);</span></p>
<p class=Code><span class=Code> <b> friend</b>
<b>void</b> <b>__stdcall</b> ServiceController(<b>unsigned</b>
CtrlCode); </span></p>
<p class=Code><span class=Code>};</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>extern</b>
PACKAGE TBeepServiceThread *BeepServiceThread; </span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#endif</span></span></p>
<p class=Captions><b>Figure
5:</b> The header for
the BeepSrvcThread program. </p>
<p class=BodyText> </p>
<p class=Code><span class=Code><span Class=CodeGrn>#include
"BeepServiceThreadU.h" </span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#pragma
package(smart_init) </span></span></p>
<p class=Code><span class=Code><span Class=CodeGrn>#pragma
resource "*.dfm" </span></span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code>TBeepServiceThread
*BeepServiceThread; </span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><i><span Class=CodeBlue>// TBeepThread implementation</span></i></span></p>
<p class=Code><span class=Code><b>__fastcall</b>
TBeepThread::TBeepThread(<b>bool</b>
CreateSuspended) </span></p>
<p class=Code><span class=Code> : TThread(CreateSuspended) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b> TBeepThread::Execute()</span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> <b> while</b>
(!Terminated) {</span></p>
<p class=Code><span class=Code> MessageBeep(0); </span></p>
<p class=Code><span class=Code> Sleep(1000); </span></p>
<p class=Code><span class=Code> } </span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><i><span Class=CodeBlue>// TBeepServiceThread implementation</span></i></span></p>
<p class=Code><span class=Code><b>__fastcall</b>
TBeepServiceThread::TBeepServiceThread(TComponent* Owner) </span></p>
<p class=Code><span class=Code> : TService(Owner) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code>PServiceController
<b>__fastcall</b></span></p>
<p class=Code><span class=Code> TBeepServiceThread::GetServiceController(<b
style='mso-bidi-font-weight:normal'>void</b>)</span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> <b> return</b>
(PServiceController) ServiceController; </span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__stdcall</b> ServiceController(<b
style='mso-bidi-font-weight:normal'>unsigned</b> CtrlCode) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepServiceThread->Controller(CtrlCode); </span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b> TBeepServiceThread::BeepServiceThreadStart(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Started) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepThread = <b>new</b> TBeepThread(<b>false</b>);</span></p>
<p class=Code><span class=Code> Started = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b>
TBeepServiceThread::BeepServiceThreadStop(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Stopped)<$I~services;threads><$I~threads;services><$I~Windows
NT;services;threads><$I~BeepService program
example;threads><$I~Windows NT;services;BeepService program example> </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepThread->Terminate();</span></p>
<p class=Code><span class=Code> Stopped = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b>
TBeepServiceThread::BeepServiceThreadPause(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b>
&Paused) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepThread->Suspend();</span></p>
<p class=Code><span class=Code> Paused = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Code><span class=Code> </span></p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b>
TBeepServiceThread::BeepServiceThreadContinue(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Continued) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepThread->Resume();</span></p>
<p class=Code><span class=Code> Continued = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
<p class=Captions><b>Figure
6: </b>The source code
for the BeepSrvcThread program. </p>
<p class=BodyText> </p>
<p class=BodyText> There
are two important differences between this service and the BeepService program
presented earlier: </p>
<p class=BodyText> 1)
This
service does not use the service's <i>OnExecute</i>
event. </p>
<p class=BodyText> 2)
This
service provides event handlers for the <i>OnStart</i>,
<i>OnStop</i>, <i>OnPause</i>, and <i>OnContinue</i>
events. </p>
<p class=BodyText> </p>
<p class=BodyText> Since I
am not using the service's built-in service thread, I must take responsibility
for specifically starting, stopping, suspending, and resuming my thread when
the SCM sends the start, stop, pause, or continue requests. For example, the <i
style='mso-bidi-font-style:normal'>OnPause</i> and <i>OnContinue</i> event handlers look like Figure 7. </p>
<p class=BodyText> </p>
<p class=Code><span class=Code><b>void</b> <b
style='mso-bidi-font-weight:normal'>__fastcall</b>
TBeepServiceThread::BeepServiceThreadPause(</span></p>
<p class=Code><span class=Code> TService *Sender, <b>bool</b> &Paused) </span></p>
<p class=Code><span class=Code>{</span></p>
<p class=Code><span class=Code> BeepThread->Suspend();</span></p>
<p class=Code><span class=Code> Paused = <b>true</b>;</span></p>
<p class=Code><span class=Code>}</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -