मैं एक ऐसी सेवा लिख ​​रहा हूं जिसमें एक टाइमर है जिसे प्रत्येक 60 सेकंड में जांचना चाहिए यदि किसी रेखा में कोई विशेष संख्या है। यहाँ टाइमर का कोड है:

procedure TConnectionChecker.Timer2Timer(Sender: TObject);
var
  myFile: TextFile;
  sLine: string;
  fileOpenLog: TStreamWriter;
  fileOpenLogName, fileOpenLogPathName: string;

begin
  ExePath := TPath.GetDirectoryName(GetModuleName(HInstance));
  filename:= 'restult.txt';
  filePath:= TPath.Combine(exePath, 'OutputFile');
  filePathName:= TPath.Combine(filePath, filename);
  fileOpenLogName:= 'Log_fileOpen.txt';
  serviceLogPath:= TPath.Combine(exePath, 'LogFiles');
  fileOpenLogPathName:= TPath.Combine(serviceLogPath, fileOpenLogName);
  fileOpenLog := TStreamWriter.Create(TFileStream.Create(fileOpenLogPathName, fmCreate or fmShareDenyWrite));

  if not FileExists(filePathName) then
  begin
    fileOpenLog.WriteLine('File not found');
    TServiceThread.Current.Terminate;
    fileOpenLog.Free;
  end;
  fileOpenLog.WriteLine('File found');
  try
    AssignFile(myFile, filePathName);
    Reset(myFile);
    fileOpenLog.WriteLine('File opened');

    while NOT eof(myFile) do
    begin
      PingWorkedAufrufe:= PingWorkedAufrufe + 1;
      readln(myFile, sLine);
      fileOpenLog.WriteLine('Read Line: ' + sLine);
      checkIfPingWorked(sLine);
    end;
    fileOpenLog.WriteLine('EOF');

  finally
    CloseFile(myFile);
  end;
  fileOpenLog.Free;
end;

और यहाँ मेरी प्रक्रिया का कोड है: checkIfPingWorked:

procedure TConnectionChecker.checkIfPingWorked(ALine: String);
var
  AValue, StartOfLineToFind: String;
  checkIfPingWorkedLog: TStreamWriter;
  checkIfPingWorkedLogName, checkIfPingWorkedLogPathName: string;
begin
  ExePath := TPath.GetDirectoryName(GetModuleName(HInstance));

  StartOfLineToFind:= '    Pakete: Gesendet =';
  ip:= '...';
  fileName:= 'restult.txt';
  filepath:= TPath.Combine(exePath, 'OutputFile');
  filepathname:= TPath.Combine(filepath, fileName);
  serviceLogPath:= TPath.Combine(exePath, 'LogFiles');
  checkIfPingWorkedLogName:= 'Log_checkIfPingWorked.txt';

  checkIfPingWorkedLogPathName := TPath.Combine(serviceLogPath, checkIfPingWorkedLogName);
  checkIfPingWorkedLog := TStreamWriter.Create(TFileStream.Create(checkIfPingWorkedLogPathName, fmCreate or fmShareDenyWrite));
  checkIfPingWorkedLog.WriteLine('Zeilen werden überprüft');
  if Pos(StartOfLineToFind, ALine) = 1 then
  begin
    AValue:= Copy(ALine, 39, 1);
    if AValue = IntToStr(5) then
      checkIfPingWorkedLog.WriteLine('Success')
    else
    begin
      checkIfPingWorkedLog.WriteLine('Error');

      //Writing E-Mail...
      //Authentifizierung
      IdSMTP1.AuthType := TIdSMTPAuthenticationType.satDefault;

      //Benutzerdaten für Authentifizierung
      IdSMTP1.Username := '...';
      IdSMTP1.Password := '...';

      //Server-Daten
      IdSMTP1.Host := '...';
      IdSMTP1.Port := ...;

      IdSMTP1.Connect;

      try
        IdMessage1.From.Address := '';
        IdMessage1.Recipients.EMailAddresses := '';
        //IdMessage1.CCList.EMailAddresses := '';
        //IdMessage1.BCCList.EMailAddresses := '';
        IdMessage1.Subject := '--AUTOMATISCHE BENACHRICHTIGUNG--';
        IdMessage1.Body.Text := 'Der PC mit der IP: ' + ip + ' konnte nicht mehr erreicht werden';
        IdSMTP1.Send(IdMessage1);
      finally
        IdSMTP1.Disconnect;
      end;
      checkIfPingWorkedLog.WriteLine('Email sent');
      TServiceThread.Current.Terminate;
    end;
  end;
  checkIfPingWorkedLog.Free;
end;

लेकिन मैं केवल पहली दो पंक्तियाँ ही पढ़ पाता हूँ और फिर वह रुक जाती है।

यह कहना महत्वपूर्ण है कि मैंने इसे मूल रूप से एक सामान्य कार्यक्रम के रूप में लिखा था। और यह ठीक काम किया। अब मैं इसे विंडोज सर्विस में बदल रहा हूं।

0
Sebastian Schwayer 8 अक्टूबर 2020, 11:26

1 उत्तर

सबसे बढ़िया उत्तर

समस्या यह थी कि मैंने हर जगह और हर बार नई लॉग फ़ाइलें बनाईं। अब मैं सर्विस क्रिएट पर एक लॉग फाइल बनाता हूं:

procedure TConnectionChecker.ServiceCreate(Sender: TObject);
var
  logFilePathName, logFileName, exePath, logFilePath: String;
begin
   ExePath := TPath.GetDirectoryName(GetModuleName(HInstance));
   logFileName:= 'log_connectionTest.txt';
   logFilePath:= TPath.Combine(exePath, 'logFile');
   logFilePathName:= TPath.Combine(logFilePath, logFileName);

   if not TDirectory.Exists(logFilePath) then
    TDirectory.CreateDirectory(logFilePath);

   swLogFile:= TStreamWriter.Create(TFileStream.Create(logFilePathName, fmCreate or fmShareDenyWrite));
end;

और मैंने एक प्रक्रिया बनाई जहां मैं 2 पैरा (गंतव्य और पाठ) मांगता हूं और लॉग फ़ाइल में लाइन लिखता हूं।

procedure TConnectionChecker.WriteToLog(destination, Text: string);
begin
  swLogFile.WriteLine('[' + DateTimeToStr(now) + '] ' + destination + ' schreibt: ' + text);
end;

अंत में मैं इसे हर प्रक्रिया में कह सकता हूं:

 WriteToLog('checkIfPingWorked', 'Success')
1
Sebastian Schwayer 27 अक्टूबर 2020, 10:10