^_^,有人中招了,本人曾提同样问题,出一百分,结果是我自己搞定的,分只好给了有苦劳的朋友们:~(
(言下之意,你是不是会给我100大洋)program Project1;uses
SvcMgr,
Unit1 in 'Unit1.pas' {sSetData: TService},
Unit2 in 'Unit2.pas';{$R *.RES}begin
Application.Initialize;
Application.Title := 'Auto Refresh CallCenter';
Application.CreateForm(TsSetData, sSetData);
Application.Run;
end.
//////////////////////////////////////////////////////
unit Unit2;interfaceuses
Classes,SysUtils;type
tSetData = class(TThread)
private
{ Private declarations }
function GetData:Integer;
function SetData:Boolean;
procedure setDataTG;
protected
procedure Execute; override;
end;implementation uses Unit1;procedure tSetdata.setDataTG;
begin
end;function tSetData.Getdata:Integer;
begin
Getdata:=0;
try
if sSetData.adoCC.Connected then
sSetData.adoCC.Close;
sSetData.adoCC.Open('sa','');
if sSetData.adoCC.Connected then
begin
try
if sSetData.aqGroup.Active then
sSetData.aqGroup.Close;
sSetData.aqGroup.SQL.Clear;
sSetData.aqGroup.SQL.Add('select count(*) from cc_group where delete_flag=''0'' and donemodify=''0'' and checkenable=''1'' and edatetime<getdate()');
sSetData.aqGroup.Open;
if not sSetData.aqGroup.Eof then
Getdata:=sSetData.aqGroup.Fields[0].AsInteger;
sSetData.aqGroup.Close;
finally
sSetData.adoCC.Close;
end;
end;
except
on E:Exception do WriteLog(E.Message+' In GetData');
end;
end;function tSetData.SetData:Boolean;
var
i,j:Integer;
begin
SetData:=True;
try
if sSetData.adoCC.Connected then
sSetData.adoCC.Close;
sSetData.adoCC.Open('sa','');
if sSetData.adoCC.Connected then
begin
try
if sSetData.aqTree.Active then
sSetData.aqTree.Close;
sSetData.aqTree.SQL.Clear;
sSetData.aqTree.SQL.Add('update cc_tree');
sSetData.aqTree.SQL.Add('set cc_tree.last_cc_termopt=cc_tree.cc_termopt,');
sSetData.aqTree.SQL.Add('cc_tree.cc_termopt=cc_tree.future_cc_termopt,');
sSetData.aqTree.SQL.Add('cc_tree.termddi=cc_tree.future_ddi');
sSetData.aqTree.SQL.Add('from cc_tree, cc_group');
sSetData.aqTree.SQL.Add('where cc_tree.cc_dnis in (select distinct cc_group.ddi from cc_group');
sSetData.aqTree.SQL.Add('where cc_group.edatetime<getdate() and');
sSetData.aqTree.SQL.Add('cc_group.delete_flag=''0'' and');
sSetData.aqTree.SQL.Add('cc_group.donemodify=''0'' and');
sSetData.aqTree.SQL.Add('cc_group.checkenable=''1'')');
i:=sSetData.aqTree.ExecSQL;
if sSetData.aqGroup.Active then
sSetData.aqGroup.Close;
sSetData.aqGroup.SQL.Clear;
sSetData.aqGroup.SQL.Add('update cc_group set cc_group.donemodify=''1''');
sSetData.aqGroup.SQL.Add('where cc_group.edatetime<getdate() and');
sSetData.aqGroup.SQL.Add('cc_group.delete_flag=''0'' and');
sSetData.aqGroup.SQL.Add('cc_group.donemodify=''0'' and');
sSetData.aqGroup.SQL.Add('cc_group.checkenable=''1''');
j:=sSetData.aqGroup.ExecSQL;
WriteLog('Modify OK: '+IntToStr(i)+' records have been modified in "cc_tree"');
WriteLog('Modify OK: '+IntToStr(j)+' records have been modified in "cc_group"');
finally
sSetData.adoCC.Close;
end;
end;
except
on E:Exception do
begin
SetData:=False;
WriteLog(E.Message+' In SetData');
end;
end;
end;procedure tSetData.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(SetDataTG);
sleep(60000);
end;
end;end.
///////////////////////////////////////////////
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, SvcMgr,
ExtCtrls, DB, ADODB,ActiveX;type
TsSetData = class(TService)
adoCC: TADOConnection;
aqTree: TADOQuery;
aqGroup: TADOQuery;
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceExecute(Sender: TService);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
procedure ServiceBeforeInstall(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;var
sSetData: TsSetData;
LogFile:string; function WriteLog(sInfo:string):Boolean;implementation uses unit2;{$R *.DFM}function WriteLog(sInfo:string):Boolean;
var
i:Integer;
dwSize:LongInt;
FileHandle:Integer;
strToWrite:string[255];
begin
WriteLog:=True;
try
if FileExists(LogFile) then
begin
FileHandle:=FileOpen(LogFile,fmOpenReadWrite);
dwSize:=GetFileSize(FileHandle,nil);
if dwSize>$800000 then
begin
FileClose(FileHandle);
DeleteFile(LogFile);
FileHandle := FileCreate(LogFile,fmOpenReadWrite);
end;
end
else
FileHandle := FileCreate(LogFile,fmOpenReadWrite);
if FileHandle<>0 then
begin
try
SetLength(strToWrite,255);
strToWrite:=DateToStr(Date)+' '+TimeToStr(Time)+ ' >> '+sInfo+#13#10;
FileSeek(FileHandle,0,2);
for i:=1 to Length(strToWrite) do
FileWrite(FileHandle,strToWrite[i],sizeof(strToWrite[i]));
finally
FileClose(fileHandle);
end;
end;
except
WriteLog:=False;
end;
end;procedure ServiceController(CtrlCode: DWord); stdcall;
begin
sSetData.Controller(CtrlCode);
end;function TsSetData.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TsSetData.ServiceStart(Sender: TService; var Started: Boolean);
begin
LogFile:=ExtractFilePath(paramstr(0))+'SetData.Log';
try
CoInitialize(nil);
if not adoCC.Connected then
adoCC.Open('sa','');
if adoCC.Connected then
begin
mySetDataThread:=tSetData.Create(False);
Started:=True;
adoCC.Close;
end
else
begin
Started:=false;
end;
except
on E:Exception do
begin
Writelog(E.Message+' In ServiceStart');
Started:=false;
raise E;
end;
end;
WriteLog('ServerStart');
end;procedure TsSetData.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog('ServerStop');
mySetDataThread.Terminate;
Stopped:=True;
CoUninitialize;
end;procedure TsSetData.ServicePause(Sender: TService; var Paused: Boolean);
begin
WriteLog('ServerPause');
mySetDataThread.Suspend;
Paused:=True;
end;procedure TsSetData.ServiceShutdown(Sender: TService);
begin
mySetDataThread.
WriteLog('ServerShutdown');
end;procedure TsSetData.ServiceExecute(Sender: TService);
begin
WriteLog('serverExecute');
end;procedure TsSetData.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
WriteLog('ServerContinue');
mySetDataThread.Resume;
Continued:=True;
end;procedure TsSetData.ServiceCreate(Sender: TObject);
begin
WriteLog('ServerCreate');
end;procedure TsSetData.ServiceDestroy(Sender: TObject);
begin
WriteLog('ServerDistroy');
end;procedure TsSetData.ServiceBeforeInstall(Sender: TService);
begin
LogFile:=ExtractFilePath(paramstr(0))+'SetData.Log';
end;end.
//////////////////////////////////////////////////
(言下之意,你是不是会给我100大洋)program Project1;uses
SvcMgr,
Unit1 in 'Unit1.pas' {sSetData: TService},
Unit2 in 'Unit2.pas';{$R *.RES}begin
Application.Initialize;
Application.Title := 'Auto Refresh CallCenter';
Application.CreateForm(TsSetData, sSetData);
Application.Run;
end.
//////////////////////////////////////////////////////
unit Unit2;interfaceuses
Classes,SysUtils;type
tSetData = class(TThread)
private
{ Private declarations }
function GetData:Integer;
function SetData:Boolean;
procedure setDataTG;
protected
procedure Execute; override;
end;implementation uses Unit1;procedure tSetdata.setDataTG;
begin
end;function tSetData.Getdata:Integer;
begin
Getdata:=0;
try
if sSetData.adoCC.Connected then
sSetData.adoCC.Close;
sSetData.adoCC.Open('sa','');
if sSetData.adoCC.Connected then
begin
try
if sSetData.aqGroup.Active then
sSetData.aqGroup.Close;
sSetData.aqGroup.SQL.Clear;
sSetData.aqGroup.SQL.Add('select count(*) from cc_group where delete_flag=''0'' and donemodify=''0'' and checkenable=''1'' and edatetime<getdate()');
sSetData.aqGroup.Open;
if not sSetData.aqGroup.Eof then
Getdata:=sSetData.aqGroup.Fields[0].AsInteger;
sSetData.aqGroup.Close;
finally
sSetData.adoCC.Close;
end;
end;
except
on E:Exception do WriteLog(E.Message+' In GetData');
end;
end;function tSetData.SetData:Boolean;
var
i,j:Integer;
begin
SetData:=True;
try
if sSetData.adoCC.Connected then
sSetData.adoCC.Close;
sSetData.adoCC.Open('sa','');
if sSetData.adoCC.Connected then
begin
try
if sSetData.aqTree.Active then
sSetData.aqTree.Close;
sSetData.aqTree.SQL.Clear;
sSetData.aqTree.SQL.Add('update cc_tree');
sSetData.aqTree.SQL.Add('set cc_tree.last_cc_termopt=cc_tree.cc_termopt,');
sSetData.aqTree.SQL.Add('cc_tree.cc_termopt=cc_tree.future_cc_termopt,');
sSetData.aqTree.SQL.Add('cc_tree.termddi=cc_tree.future_ddi');
sSetData.aqTree.SQL.Add('from cc_tree, cc_group');
sSetData.aqTree.SQL.Add('where cc_tree.cc_dnis in (select distinct cc_group.ddi from cc_group');
sSetData.aqTree.SQL.Add('where cc_group.edatetime<getdate() and');
sSetData.aqTree.SQL.Add('cc_group.delete_flag=''0'' and');
sSetData.aqTree.SQL.Add('cc_group.donemodify=''0'' and');
sSetData.aqTree.SQL.Add('cc_group.checkenable=''1'')');
i:=sSetData.aqTree.ExecSQL;
if sSetData.aqGroup.Active then
sSetData.aqGroup.Close;
sSetData.aqGroup.SQL.Clear;
sSetData.aqGroup.SQL.Add('update cc_group set cc_group.donemodify=''1''');
sSetData.aqGroup.SQL.Add('where cc_group.edatetime<getdate() and');
sSetData.aqGroup.SQL.Add('cc_group.delete_flag=''0'' and');
sSetData.aqGroup.SQL.Add('cc_group.donemodify=''0'' and');
sSetData.aqGroup.SQL.Add('cc_group.checkenable=''1''');
j:=sSetData.aqGroup.ExecSQL;
WriteLog('Modify OK: '+IntToStr(i)+' records have been modified in "cc_tree"');
WriteLog('Modify OK: '+IntToStr(j)+' records have been modified in "cc_group"');
finally
sSetData.adoCC.Close;
end;
end;
except
on E:Exception do
begin
SetData:=False;
WriteLog(E.Message+' In SetData');
end;
end;
end;procedure tSetData.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(SetDataTG);
sleep(60000);
end;
end;end.
///////////////////////////////////////////////
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, SvcMgr,
ExtCtrls, DB, ADODB,ActiveX;type
TsSetData = class(TService)
adoCC: TADOConnection;
aqTree: TADOQuery;
aqGroup: TADOQuery;
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceExecute(Sender: TService);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
procedure ServiceBeforeInstall(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;var
sSetData: TsSetData;
LogFile:string; function WriteLog(sInfo:string):Boolean;implementation uses unit2;{$R *.DFM}function WriteLog(sInfo:string):Boolean;
var
i:Integer;
dwSize:LongInt;
FileHandle:Integer;
strToWrite:string[255];
begin
WriteLog:=True;
try
if FileExists(LogFile) then
begin
FileHandle:=FileOpen(LogFile,fmOpenReadWrite);
dwSize:=GetFileSize(FileHandle,nil);
if dwSize>$800000 then
begin
FileClose(FileHandle);
DeleteFile(LogFile);
FileHandle := FileCreate(LogFile,fmOpenReadWrite);
end;
end
else
FileHandle := FileCreate(LogFile,fmOpenReadWrite);
if FileHandle<>0 then
begin
try
SetLength(strToWrite,255);
strToWrite:=DateToStr(Date)+' '+TimeToStr(Time)+ ' >> '+sInfo+#13#10;
FileSeek(FileHandle,0,2);
for i:=1 to Length(strToWrite) do
FileWrite(FileHandle,strToWrite[i],sizeof(strToWrite[i]));
finally
FileClose(fileHandle);
end;
end;
except
WriteLog:=False;
end;
end;procedure ServiceController(CtrlCode: DWord); stdcall;
begin
sSetData.Controller(CtrlCode);
end;function TsSetData.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TsSetData.ServiceStart(Sender: TService; var Started: Boolean);
begin
LogFile:=ExtractFilePath(paramstr(0))+'SetData.Log';
try
CoInitialize(nil);
if not adoCC.Connected then
adoCC.Open('sa','');
if adoCC.Connected then
begin
mySetDataThread:=tSetData.Create(False);
Started:=True;
adoCC.Close;
end
else
begin
Started:=false;
end;
except
on E:Exception do
begin
Writelog(E.Message+' In ServiceStart');
Started:=false;
raise E;
end;
end;
WriteLog('ServerStart');
end;procedure TsSetData.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog('ServerStop');
mySetDataThread.Terminate;
Stopped:=True;
CoUninitialize;
end;procedure TsSetData.ServicePause(Sender: TService; var Paused: Boolean);
begin
WriteLog('ServerPause');
mySetDataThread.Suspend;
Paused:=True;
end;procedure TsSetData.ServiceShutdown(Sender: TService);
begin
mySetDataThread.
WriteLog('ServerShutdown');
end;procedure TsSetData.ServiceExecute(Sender: TService);
begin
WriteLog('serverExecute');
end;procedure TsSetData.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
WriteLog('ServerContinue');
mySetDataThread.Resume;
Continued:=True;
end;procedure TsSetData.ServiceCreate(Sender: TObject);
begin
WriteLog('ServerCreate');
end;procedure TsSetData.ServiceDestroy(Sender: TObject);
begin
WriteLog('ServerDistroy');
end;procedure TsSetData.ServiceBeforeInstall(Sender: TService);
begin
LogFile:=ExtractFilePath(paramstr(0))+'SetData.Log';
end;end.
//////////////////////////////////////////////////
复杂操作最好单独创建一线程,如上,
简单操作可在procedure ServiceExecute(Sender: TService)里定义
更多的知识你可能要查书了:
李维的书(三本书中某一本,但我忘了名字)里有,但相关性不大
人邮的《C++Builder4技术内幕》里有服务的理论知识
线程的知识那儿都有