⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cb199910nt0602_f.asp.htm

📁 C++builder学习资料C++builder
💻 HTM
📖 第 1 页 / 共 5 页
字号:
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> &nbsp; </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> &nbsp; </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> &nbsp; </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>&nbsp; </span></p>  

  

<p class=Code><span class=Code><span Class=CodeGrn>#include  

&lt;SysUtils.hpp&gt; </span></span></p>  

  

<p class=Code><span class=Code><span Class=CodeGrn>#include  

&lt;Classes.hpp&gt; </span></span></p>  

  

<p class=Code><span class=Code><span Class=CodeGrn>#include  

&lt;SvcMgr.hpp&gt; </span></span></p>  

  

<p class=Code><span class=Code>&nbsp; </span></p>  

  

<p class=Code><span class=Code><b>class</b>  

TBeepThread : <b>public</b> TThread {</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> public</b>:</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;<b> virtual</b>  

<b>__fastcall</b> <b>void</b> Execute();</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;<b> __fastcall</b>  

TBeepThread(<b>bool</b> CreateSuspended); </span></p>  

  

<p class=Code><span class=Code>};</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>:&nbsp;&nbsp;&nbsp;&nbsp;<i> <span Class=CodeBlue>// IDE-managed Components</span></i></span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> void</b>  

<b>__fastcall</b> BeepServiceThreadStart(</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Started); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> void</b>  

<b>__fastcall</b> BeepServiceThreadStop(</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Stopped); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> void</b>  

<b>__fastcall</b> BeepServiceThreadPause(</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Paused); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> void</b>  

<b>__fastcall</b>  

BeepServiceThreadContinue(</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Continued); </span></p>  

  

<p class=Code><span class=Code><b>private</b>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i> <span Class=CodeBlue>// User declarations</span></i></span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;TBeepThread* BeepThread; </span></p>  

  

<p class=Code><span class=Code><b>public</b>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i> <span Class=CodeBlue>// User declarations</span></i></span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<b> __fastcall</b>  

TBeepServiceThread(TComponent* Owner); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;PServiceController <b>__fastcall</b> GetServiceController(<b>void</b>);</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;<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>&nbsp; </span></p>  

  

<p class=Code><span class=Code><b>extern</b>  

PACKAGE TBeepServiceThread *BeepServiceThread; </span></p>  

  

<p class=Code><span class=Code>&nbsp; </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> &nbsp; </p>  

  

<p class=Code><span class=Code><span Class=CodeGrn>#include  

&quot;BeepServiceThreadU.h&quot; </span></span></p>  

  

<p class=Code><span class=Code>&nbsp; </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 &quot;*.dfm&quot; </span></span></p>  

  

<p class=Code><span class=Code>&nbsp; </span></p>  

  

<p class=Code><span class=Code>TBeepServiceThread  

*BeepServiceThread; </span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;: 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>&nbsp; </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>&nbsp;&nbsp;<b> while</b>  

(!Terminated) {</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;MessageBeep(0); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;&nbsp;&nbsp;Sleep(1000); </span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;} </span></p>  

  

<p class=Code><span class=Code>}</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: 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>&nbsp; </span></p>  

  

<p class=Code><span class=Code>PServiceController  

<b>__fastcall</b></span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b> return</b>  

(PServiceController) ServiceController; </span></p>  

  

<p class=Code><span class=Code>}</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeepServiceThread-&gt;Controller(CtrlCode); </span></p>  

  

<p class=Code><span class=Code>}</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Started) </span></p>  

  

<p class=Code><span class=Code>{</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;BeepThread = <b>new</b> TBeepThread(<b>false</b>);</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;Started = <b>true</b>;</span></p>  

  

<p class=Code><span class=Code>}</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Stopped)&lt;$I~services;threads&gt;&lt;$I~threads;services&gt;&lt;$I~Windows  

NT;services;threads&gt;&lt;$I~BeepService program  

example;threads&gt;&lt;$I~Windows NT;services;BeepService program example&gt; </span></p>  

  

<p class=Code><span class=Code>{</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;BeepThread-&gt;Terminate();</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;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>&nbsp;&nbsp; TService *Sender, <b>bool</b>  

&amp;Paused) </span></p>  

  

<p class=Code><span class=Code>{</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;BeepThread-&gt;Suspend();</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;Paused = <b>true</b>;</span></p>  

  

<p class=Code><span class=Code>}</span></p>  

  

<p class=Code><span class=Code>&nbsp; </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>&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Continued) </span></p>  

  

<p class=Code><span class=Code>{</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;BeepThread-&gt;Resume();</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;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> &nbsp; </p>  

  

<p class=BodyText> There  

are two important differences between this service and the BeepService program  

presented earlier: </p>  

  

<p class=BodyText> 1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  

This  

service does not use the service's <i>OnExecute</i>  

event. </p>  

  

<p class=BodyText> 2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  

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> &nbsp; </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> &nbsp; </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>&nbsp;&nbsp;TService *Sender, <b>bool</b> &amp;Paused) </span></p>  

  

<p class=Code><span class=Code>{</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;BeepThread-&gt;Suspend();</span></p>  

  

<p class=Code><span class=Code>&nbsp;&nbsp;Paused = <b>true</b>;</span></p>  

  

<p class=Code><span class=Code>}</span></p>  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -