AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

使用 C++ Builder 创建应用程序

51自学网 http://www.51zixue.net


    4)最后,单击窗口的客户区(但不是ServiceSocket)选择Service1。在对象观察器中,双击OnExecute事件,添加以下事件处理程序。


    编写服务器应用程序时,应当知道:
· 服务线程。
· 服务名属性。
· 调试服务。
    1.服务线程
    每个服务都有自己的线程(TServiceThread),因此,如果服务应用程序实现多个服务,则必须确定服务实例是安全的线程(thread_safe)。TServiceThread被设计成可以使用TService的OnExecute事件处理程序实现服务,服务线程有自己的Execute方法,它包含一个能在处理新请求之前调用服务的OnStart和OnExecute处理程序的循环。
    因为服务请求可能会花很长时间进行处理,服务应用程序也可能同时收到多个用户的类似请求,较有效的方法是对每个请求产生新线程(从TThread而不是TServiceThread中派生),并将服务实例移到新线程的Execute方法中。这将允许服务线程的Execute循环连续地处理新请求且不用等待服务的OnExecute处理程序结束。下面是一个例子。
    范例:这个服务会在标准的线程中每隔500μs便发出声响,当服务被告之要暂停、继续或停止时,它会处理线程的暂停、继续或停止。
    1)选择File|New,在NewItems对话框中选择ServiceApplication,将打开一个名为Service1的窗口。
    2)在程序单元的头文件中,声明一个名为TSparkyThread的TThread的新后代,它是为服务工作的线程,声明如下:


    3)下一步,在程序单元的.cpp的文件中,为TSparkyThread实例创建全局变量。
 TSparkThread *Sparkythread;

    4)把以下代码加入到.cpp文件中的TSparkyThread构造函数中。


    5)在.cpp文件的TSparkyThreadExecute方法(线程函数)中加入以下代码:


    6)选择Service窗口(Service1),在对象观察器中双击OnStart事件,在OnStart事件处理程序中加入以下代码:


    7)在对象观察器中双击OnContinue事件,在OnContinue事件处理程序中加入以下代码。


    8)在对象观察器中,双击OnPause事件,在OnPause事件处理程序中添加以下代码:


    9)最后,双击对象观察器中的OnStop事件,在OnStop事件处理程序中添加以下代码:


    在开发服务应用程序时,应根据所提供服务的性质、连接的预期数目以及期望运行服务的处理器数派生新线程。

    2.服务名属性
    VCL提供了创建服务应用程序的类,包括TService和TDependency,使用这些类时,不同的名称属性易使人感到混淆,本节描述了它们之间的区别。
    具有与口令关联的用户名(称之为Service启动名)的服务,在管理器和编辑窗口显示名称和真名称(该服务的名字)。Dependency 可以是服务或者按分组顺序装载,它们也有名字和显示名。因为服务对象是从TComponent派生,所以它们继承了Name属性,下面两节概要介绍这些名称属性。
    (1)TDependency属性
    TDependency的DisplayName既是服务的显示名又是真实名,它几乎总是和TDependency的Name属性相同。

    (2)TService名称属性
    TService的Name属性从TComponent中派生,它是组件名,也是服务名,对于作为服务的Dependency,这个属性与TDependency的Name和DisplayName属性相同。
    TService的DisplayName是显示在服务管理器(ServiceManager)窗口中的名字,它通常和真实服务名不同(TService::Name、TDependency::DisplayName、TDependency::Name),注意通常Dependency的DisplayName和Service的DisplayName不同。
    服务启动名与服务显示名、真实服务名是不一样的,ServiceStartName是在服务控制管理器中选择Start对话框输入的用户名。

    3.调试服务
    调试服务应用程序有一些技巧,因为它需要一些短的间隔时间。
    1)首先,在调试器中,启动应用程序,等待数秒直至装入完成。
    2)从控制面板或命令行快速启动服务。
    必须快速启动服务(应用程序启动在15~30s内),因为如果没有服务被启动,则程序会终止。
    当应用程序运行时,附加服务应用程序也是一种方法(也就是说,先启动服务,再附加调试器)。为了与服务应用程序进程连上,可选择Run|AttachToProcess,并在结果对话框中选择服务应用程序,在某些情况下,因为没有充分的权限,会使第二种方法失败。如果是这样,可以使用服务控制管理器来激活调试器的调试服务。

    1)首先,在下列注册项中创建名为ImageFileExecutionOptions的关键字。
 HKEY_LOCAL_MACHINE/SIFTWARE/Microsoft/Windows NT/CurrentVersion
    2)创建与服务(如:MYSERV.EXE)同名的子关键字。在这个子关键字中加入类型为REG_SZ的值,命名为Debugger。使用到BCB.exe的完整路经名作为字符串的串值。
    3)在服务控制面板的应用程序中选择服务,单击Startup并选中AllowService为Interactwith Desktop。

 
 

上一篇:在C++Builder中创建DLL  下一篇:C++ Builder 定义线程对象