2012-09-17 87 views
3

'MyThread'无法运行。我不知道这个问题是否发生在'DataTransferServiceStart'过程中。我猜'DataTransferServiceStart'过程不会执行。 IDE是Delphi XE。请帮助我,非常感谢你。delphi xe下的服务应用程序线程无效

主题的单位:

unit Unit_MyThread; 

interface 

uses 
    Classes, SysUtils; 

type 
    TMyThread = class(TThread) 
    private 
    { Private declarations } 
    protected 
    procedure Execute; override; 
    end; 

implementation 


procedure TMyThread.Execute; 
var 
    log: TextFile; 
    logPath: String; 
    i: Integer; 
begin 
    logPath := 'd:\test.log'; 
    AssignFile(log, logPath); 
    Append(log); 
    i := 0; 
    while not self.Terminated do 
    begin 
    Sleep(1); 
    Writeln(log, IntToStr(i)); 
    if i=10 then 
     Terminate; 
    i := i + 1; 
    end; 
    CloseFile(log); 
end; 

end. 

主要服务单位:

unit Unit_main; 

interface 

uses 
    Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, 
    ExtCtrls, DB, ADODB, Unit_MyThread; 

type 
    TDataTransferService = class(TService) 
    DBSrc: TADOConnection; 

    procedure DataTransferServiceStart(Sender: TService; var Started: Boolean); 
    procedure DataTransferServiceContinue(Sender: TService; var Continued: Boolean); 
    procedure DataTransferServicePause(Sender: TService; var Paused: Boolean); 
    procedure DataTransferServiceStop(Sender: TService; var Stopped: Boolean); 

    public 
    function GetServiceController: TServiceController; override; 
    end; 
var 
    DataTransferService: TDataTransferService; 
    MyThread: TMyThread; 
implementation 

{$R *.DFM} 

procedure ServiceController(CtrlCode: DWord); stdcall; 
begin 
    DataTransferService.Controller(CtrlCode); 
end; 

function TDataTransferService.GetServiceController: TServiceController; 
begin 
    Result := ServiceController; 
end; 

procedure TDataTransferService.DataTransferServiceStart(Sender: TService; 
    var Started: Boolean); 
begin 
    MyThread := TMyThread.Create(False); 
    Started := True; 
end; 

procedure TDataTransferService.DataTransferServiceContinue(Sender: TService; 
    var Continued: Boolean); 
begin 
    MyThread.Start; 
    Continued := True; 
end; 

procedure TDataTransferService.DataTransferServicePause(Sender: TService; 
    var Paused: Boolean); 
begin 
    MyThread.Suspended := true; 
    Paused := True; 
end; 

procedure TDataTransferService.DataTransferServiceStop(Sender: TService; 
    var Stopped: Boolean); 
begin 
    MyThread.Terminate; 
    Stopped := True; 
end; 

end. 
+2

它在哪里失败。它是如何失败的。 –

+2

'd:\ test.log'是否已经存在? –

+4

什么“不起作用”是指*具体*?如果您需要帮助,您需要提供我们可以用来尝试并提供给您的信息。 “不起作用”没有解释你的意思是没有意义的。 –

回答

2

您的服务是最有可能无法启动,因为你有一个TADOConnection组件投进您服务。你不能在服务中这样做。由于ADO是COM,所以您必须使用CoInitialize(nil)CoUninitialize初始化每个线程,并且只能在此范围内创建/使用您的数据库组件。

uses 
    ActiveX; 

procedure TDataTransferService.DataTransferServiceStart(Sender: TService; 
    var Started: Boolean); 
begin 
    CoInitialize(nil); 
    DBSrc:= TADOConnection.Create(nil); 
    //Initialize and Connect DBSrc 
    MyThread := TMyThread.Create(False); 
    Started := True; 
end; 

procedure TDataTransferService.DataTransferServiceStop(Sender: TService; 
    var Stopped: Boolean); 
begin 
    MyThread.Terminate; 
    //Disconnect DBSrc 
    DBSrc.Free; 
    CoUninitialize; 
    Stopped := True; 
end; 

这里阅读:Ok to use TADOConnection in threads

+0

你的代码中有一个额外的'CoUnitialize'。你在'DataTransferServiceStart'中调用'CoInitialize'一次,但是在'DataTransferServiceStop'和'Execute'中的'finally'块中调用'CoUnitialize'。 –

+0

哎呀,我的意思是删除第一个块。当我发布时,我很着急。 –

+0

嗯..我注意到'DBSrc:TADOConnection',但忽略它,因为它似乎没有创建任何地方。 –

相关问题