2012-09-17 30 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',但忽略它,因爲它似乎沒有創建任何地方。 –

相關問題