 constructor THeoRTNZapisObjMatThread.Create (AOnTerminate: TNotifyEvent; AService: TService = nil; dm: TdatMod = nil);
  begin
   inherited Create (false);          // Create thread in NOT suspended mode
   FMainService := AService;
   FDataMod := dm;
   FLock := TCriticalSection.Create;
   FRunning := false;
   FTermEvent := TEvent.Create (nil, False, False, '');


//   OnTerminate:= AOnTerminate;
//   FreeOnTerminate:= true;
   FreeOnTerminate := false;          // Ensure manual freeing of thread resources
  end;




 destructor THeoRTNZapisObjMatThread.Destroy;
  begin
{$IFDEF DEBUG}
   Write('Ukoncuji thread RTN Zapis objednavka materialu do ExpPr...');
{$ENDIF}
   try
    if (FTimer<>0) then
     CloseHandle (FTimer);
    FTermEvent.Free;
    finally
   end;
   FRunning := false;
   FMainService := nil;
   FDataMod := nil;
   Terminate;
   FLock.Free;
   inherited;
{$IFDEF DEBUG}
   WriteLn('OK');
{$ENDIF}
  end;



 procedure THeoRTNZapisObjMatThread.TerminatedSet;
  begin
   FTermEvent.SetEvent;
  end;



 procedure THeoRTNZapisObjMatThread.ThreadTerminate;
  begin
   Terminate;
   WaitFor;
  end;



 procedure THeoRTNZapisObjMatThread.Execute;
  const _Second = 10_000_000;
  var lSQL, errMsg, url, outData, fName, loopCasTyp: string;
      lokalniConn: boolean;
      lLoop, idDigiFile, cnt, idx: Integer;
      lLoopMax, koefProCas: integer;
      logRunCnt, intTemp: integer;
      Msg: TMsg;
      firstRun, inProg, inDL: boolean;
      lQry: TFDQuery;
      sqlConnX: TFDConnection;

      lBusy: LongInt;
      liDueTime: LARGE_INTEGER;

      cfgFile: string;
      specCfgXML: XML.XmlIntf.IXMLDocument;
      n1: XML.XmlIntf.IXMLNode;
      attribs: IXMLNodeList;
      attrIdx: integer;
  begin
   lLoop:= 0;
   idDigiFile:= 0;
   logRunCnt:= 1;

   lLoopMax:= 3; // v minutach !!!!
   try
     try
       CoInitialize(nil);
       cfgFile:= ExtractFilePath(ParamStr(0)) + 'hdcDZApiCfg.xml';
       if (FileExists(cfgFile)) then
        begin
         specCfgXML:= Xml.XMLDoc.TXMLDocument.Create(nil);
         specCfgXML.LoadFromFile (cfgFile);
         specCfgXML.Active:= true;
         if not(specCfgXML.IsEmptyDoc) then
          begin
           if (specCfgXML.DocumentElement<>nil) then
            begin
             n1:= specCfgXML.DocumentElement;
             if (n1.NodeName='config') then
              begin
               attribs:= n1.AttributeNodes;

               attrIdx:= attribs.IndexOf('zapisObjMatExpPrIntMins');
               if (attrIdx>-1) then
                if TryStrToInt(VarToStr(attribs.Get(attrIdx).NodeValue), intTemp) then
                 lLoopMax:= intTemp;
              end; // n1 = config
            end; // specCfgXML.DocumentElement<>nil
          end; // not specCfgXML.IsEmptyDoc
        end; // FileExists(cfgFile)
      except
       on E: Exception do
        datMod.LogInfo (Quick.Logger.etError, 'Chyba cteni konfigu THeoRTNZapisObjMatThread: ' + E.Message);
     end;
    finally
     begin
      if (specCfgXML<>nil) then
       specCfgXML := nil;
      CoUninitialize;
     end;
   end;

   datMod.LogInfo (Quick.Logger.etInfo, 'Zapis Objednavek materialu do ExpPr - interval: ' + lLoopMax.ToString + ' min.');
   lLoopMax := lLoopMax * 60; // minuty na vteriny


   firstRun := true;
   inProg := false;
   FRunning := true;

   if (1=1) then // pro rychle vypnuti
    begin
     FTimer := CreateWaitableTimer (nil, true, 'RTNZapisObjMatExpPrWaitableTimer');
     liDueTime.QuadPart := -1*_Second;


     while not(Terminated) and FRunning do
      begin
       if (HDCDZApiService<>nil) then
        if (HDCDZApiService.Terminated) then
         begin
          Terminate;
          FRunning:= false;
         end;

       PeekMessage (&Msg, 0, 0, 0, PM_NOREMOVE); { Create message queue }

       if (lLoop=lLoopMax) or (firstRun) then  // pri startu a pak kazdou minutu
        begin

         lokalniConn := (FDataMod<>nil);
         if not(lokalniConn) then
           begin
            sqlConnX := FDataMod.sqlConn;
           end
          else
           begin
            sqlConnX := TFDConnection.Create (nil);
            sqlConnX.ConnectionDefName := sqlPoolName;
           end;
         try
           sqlConnX.Open;

           lQry := TFDQuery.Create(nil);
           try
             lQry.Connection := sqlConnX;

             idDigiFile:= 0;
             firstRun:= false;

             if (logRunCnt<4) then
              FDataMod.LogInfo (Quick.Logger.etInfo, 'Spoustim zapis Objednavky materialu do ExpPr c.' + logRunCnt.toString + '...');
             if (logRunCnt=4) then
              FDataMod.LogInfo (Quick.Logger.etInfo, 'Spoustim zapis Objednavky - bezi, ale dal neloguju');

             try
               if not(inProg) then // nebezi uz ?
                begin

                 if (1=1) then // pro rychle vypnuti
                  begin
                   if (sqlConnX.Connected) then
                    begin
                     inProg:= true;

                     lSQL:= 'DECLARE @errMsg NVARCHAR(500)=N''''' + CRLF +'IF OBJECT_ID(N''dbo.ep_Vyroba_GenObjednavkuMatDoVyrobyNew'', N''P'') IS NOT NULL' + CRLF
                          + ' EXEC dbo.ep_Vyroba_GenObjednavkuMatDoVyrobyNew @errMsg OUT' + CRLF + 'SELECT @errMsg AS ErrMsg';

                     lQry.Open(lSQL);
                     if (lQry.RecordCount>0) then
                      begin
                       lQry.First;
                       errMsg := lQry.FieldByName('ErrMsg').AsString;
                       if (errMsg<>'') then
                        begin
                         FDataMod.LogInfo (Quick.Logger.etInfo, 'Zapis Objednavky materialu do ExpPr - chyba: ' + errMsg);
   {$IFDEF DEBUG}
                         WriteLn ('Zapis Objednavky materialu do ExpPr - chyba: ' + errMsg);
   {$ENDIF}
                        end;
                      end;

                     inProg := false;
                    end; // sql Connected
                  end; // 1=1
                end;

              except on E:Exception do
               begin
                inProg := false;
                errMsg := E.Message; // datMod.sqlQry11.FieldByName('ErrMsg').AsString;
                if (mamTabPrijataData) then
                 begin
                  datMod.LogInfo (Quick.Logger.etError, 'Zapis Objednavky materialu do ExpPr - chyba: ' + errMsg);
   {$IFDEF DEBUG}
                  WriteLn ('Zapis Objednavky materialu do ExpPr - chyba: ' + errMsg);
   {$ENDIF}
                 end;
               end;
             end;
            finally
             lQry.Close;
             lQry.Free;
           end;

          finally
           if (lokalniConn) then
            begin
             sqlConnX.Close;
             sqlConnX.Free;
            end;
         end;

         lLoop := 0;
         if (logRunCnt<6) then // pro vypnuti zprav o zpracovani dat
          Inc (logRunCnt);
        end; // if lLoop=lLoopMax...

       Inc (lLoop);


       if (FTimer<>0) then
        SetWaitableTimer (FTimer, TLargeInteger(liDueTime), 0, nil, nil, false);
       repeat
        lBusy := MsgWaitForMultipleObjects (1, FTimer, false, INFINITE, QS_ALLINPUT);
       until lBusy = WAIT_OBJECT_0;
//        Sleep (998);

      end; // while not(Terminated) and FRunning

     if (FTimer<>0) then
      CloseHandle (FTimer);

    end; // 1=1

  end;


