Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Funktion FileExists Timeout

  Alt 11. Jul 2007, 08:32
Habe mir mal die Komponente angesehen, sieht so nicht schlecht aus.

Problem ist ja hier nur, es wird sich ja nichts ändern.

"C:\Boot.ini" wird immer "C:\Boot.ini" heißen, sie wird nicht umbenannt oder geändert.
Der letzte lesezugriff trifft ja auch nicht zu, Die meisten sind Server und bleiben somit eine
ganze Weile Online.

Vllt. könntest Du mir ja sagen, wie lange er braucht um dich zu benachrichtigen, wenn ein Verzeichnis
nicht mehr Erreichbar ist.

Kleines Nebenproblem ist das ich pro Rechner einmal die Komponente bräuchte und diese natürlich nicht
mehr in interaktion mit dem Ping stehen würde.
Im Moment läuft im Hintergrund ein Thread der in einer Schleife jeden rechner anpingt und gleichzeitig
sofern es ein PC ist die Dateifreigabe.

Delphi-Quellcode:
  while not terminated do // Solange kein Terminate gesendet wird fortlaufen
    begin
    // Wert bis zum Timeout warten holen und setzen
    SQLStr := 'SELECT Wert FROM Config WHERE Sub1 = 1 AND Sub2 = 2';
    Qry_GetPK.Active := False;
    Qry_GetPK.SQL.Text := SQLStr;
    Qry_GetPK.Active := True;
    IcmpClient.ReceiveTimeout := DS_GetPK.DataSet.FieldbyName('Wert').AsInteger;

    SQLStr := 'SELECT PK_IP '
      + 'FROM IP '
      + 'WHERE Ueberwachen_Aktiv = 1';

    Qry_GetPK.Active := False;
    Qry_GetPK.SQL.Text := SQLStr;
    Qry_GetPK.Active := True;

    for I := 0 to Qry_GetPK.RecordCount -1 do
      begin
      ID := DS_GetPK.DataSet.FieldbyName('PK_IP').AsString;

      SQLStr := 'SELECT IP, Name, FileCheck, TimeOutCount, '
        + 'Nicht_erreichbar_seit, HideTimeOut, Hidefor '
        + 'FROM IP '
        + 'WHERE PK_IP = %s';

      SQLStr := Format(SQLStr, [ID]);

      Qry_GetPCIPs.Active := False;
      Qry_GetPCIPs.SQL.Text := SQLStr;
      Qry_GetPCIPs.Active := True;

      HostIP := DS_GetPCIPs.DataSet.FieldbyName('IP').AsString;
      Hostname := DS_GetPCIPs.DataSet.FieldbyName('Name').AsString;
      FileCheck := DS_GetPCIPs.DataSet.FieldbyName('FileCheck').AsBoolean;
      TimeOutCount := DS_GetPCIPs.DataSet.FieldbyName('TimeOutCount').AsInteger;
      Nicht_erreichbar_seit := DS_GetPCIPs.DataSet.FieldbyName('Nicht_erreichbar_seit').AsString;
      if Nicht_erreichbar_seit = '01.01.1900then
        Nicht_erreichbar_seit := '';

      IcmpClient.Host := HostIP;
      IcmpClient.Ping(); // Client anpingen

      IPIndex := I;
      Synchronize(DoUpdate);

      if FileCheck then
        FileOK := FileExists( Format(FILENAMETOCHECK, [HostIP]) )
          else FileOK := True;

      if (IcmpClient.ReplyStatus.ReplyStatusType = rsTimeOut) or not FileOK then // Result des Pings auswerten
        begin
// Server Lieferte einen Timeout -----------------------------------------------
        Inc(TimeOutCount);

        Qry_GetPCIPs.Requery(); // Requery, falls Daten geändert wurden und Daten neu Holen fürs TimeOut

        HideTimeOut := DS_GetPCIPs.DataSet.FieldbyName('HideTimeOut').AsBoolean;
        Hidefor := DS_GetPCIPs.DataSet.FieldbyName('Hidefor').AsDateTime;

        if HideTimeOut then
          begin
          if (Hidefor < Now) then
            begin
            HideTimeOut := False;
            HideFor := StrtoDate('01.01.1900');
            end;
          end;

        if (TimeOutCount >= 3) and (Nicht_Erreichbar_seit = '') then
          begin
          // Änderung des Status von Online auf Offline
          ServerStatus(0, ID);

          SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, '
            + 'Letzter_Ping = %s, Nicht_erreichbar_seit = %s, HideTimeOut = %s, Hidefor = %s '
            + 'WHERE PK_IP = %s';

          SQLStr := Format(SQLStr, ['0', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
            '''' + DatetimetoStr(Now) + '''', BooltoStr(HideTimeOut), '''' + DateTimetoStr(Hidefor) + '''', ID]);
          end
            else begin
            SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, Letzter_Ping = %s, HideTimeOut = %s, Hidefor = %s '
              + 'WHERE PK_IP = %s';

            SQLStr := Format(SQLStr, ['0', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
              BooltoStr(HideTimeOut), '''' + DateTimetoStr(Hidefor) + '''', ID]);
            end;

        end
// Server lieferte keinen Timeout ----------------------------------------------
          else begin
          TimeOutCount := 0;

          if (Nicht_erreichbar_seit <> '') then
            begin
            // Änderung von Offline auf Online
            ServerStatus(1, ID);

            SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, '
              + 'Letzter_Ping = %s, Nicht_erreichbar_seit = %s, HideTimeOut = 0, Hidefor = %s '
              + 'WHERE PK_IP = %s';

            SQLStr := Format(SQLStr, ['1', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''',
              '''' + '' + '''', '''' + '' + '''', ID]);
            end
              else begin
              SQLStr := 'UPDATE IP SET Erreichbar = %s, TimeOutCount = %s, Letzter_Ping = %s, '
                + 'HideTimeOut = 0, Hidefor = %s WHERE PK_IP = %s';

              SQLStr := Format(SQLStr, ['1', InttoStr(TimeOutCount), '''' + DateTimetoStr(Now) + '''', '''' + '' + '''', ID]);
              end;

          TimeOutCount := 0;
          end;

      Qry_Set.Active := False;
      Qry_Set.SQL.Text := SQLStr;
      Qry_Set.ExecSQL;

      Qry_GetPK.Next;
      end;

    Synchronize(DoFinish);

    Sleep(100);

    RunComplete;
    end;
die beiden Synchchronizes sind nur für die Visuelle Darstellung am Server.
Anzeige des Servers der gescannt wird.
Anstoss zum aktualisieren des Grids.
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat