Страница 1 из 2

Фоновый процесс в галактике

Добавлено: 03 авг 2005, 18:01
Juve
Здравствуйте.
Есть задача написать цикл "слежения" за файликом. Если данные в нем изменяются, то галка должна вызвать определенный фейс.
Написал dll, однако цикл, её вызывающий из собственного фейса, понятное дело, вешает всю систему.
Есть какие либо мысли по этому поводу, может можно таймер как то установить и событие проверки периодически вызывать. Буду благодарен за любые предложения.

Добавлено: 03 авг 2005, 19:46
Juve
Проблема решилась, откопал нужную функцию

Function StartTimer (aCommand : Word; tInterval : Longint; mNotify : Boolean) : Boolean;

:D

Добавлено: 23 авг 2005, 17:31
Maverick
ток не забывай его вовремя стопать )))

Добавлено: 08 ноя 2005, 16:30
DarkAngel27
А не поделитесь опытом: как вам удалось запустить данный таймер? У меня он срабатывает 2 раза: 1 раз при инициализации фейса и второй раз при его закрытии...

cmInit:
{
StartTimer(funс1,1,true);
....
}

Добавлено: 14 ноя 2005, 10:13
Maverick
StartTimer вещаем на cmInit
StopTimer вешаем на cmDone

а на cmIdle вешаем агента-следователя )))

Добавлено: 14 ноя 2005, 11:11
DarkAngel27
StartTimer вещаем на cmInit
StopTimer вешаем на cmDone

а на cmIdle вешаем агента-следователя )))
А что подразумевается под агент-следователь?

Добавлено: 14 ноя 2005, 11:13
Maverick
ну функцию, которая бы отслеживала состояние файла :grin:

Добавлено: 14 ноя 2005, 11:19
DarkAngel27
У меня именно так и сделано, о результате см. выше.
В описании VIP написано что cmIdle проходит сразу после сдвига записи по таблице (cmPosUp etc.), а у меня это может произойти 1 раз в 5 минут, соответственно это событие проходит задолго до обновления файлика. Из-за этого может не работать? И как это избежать?

Добавлено: 14 ноя 2005, 11:32
Maverick
хм...
тогда в HandleEvent End попробуй использовать событие
Always : { ... } и в нем юзать свою функцию

Справочно:

Обработчик Always и функция CurCommand

* Появилась возможность описания секции в обработчике HandleEvent и TableHandleEvent для обработки всех команд (Always). Секция Always будет вызываться для любой команды в обработчике независимо от наличия секции для обработки текущей команды.

* Появился метод интерфейса CurCommand : word для получения текущей команды

Пример
HandleEvent
cmInit : {}
Always
{
Message (string (CurCommand)); // так не делать - зациклится !
}
cmPositionChanged : {}
End;


Версия : Атлантис 3.03.03.

Добавлено: 14 ноя 2005, 12:26
DarkAngel27
Как ни странно, но Галактика закрывается без единого предупреждения :(
Отрабатывает порядком 10-15 раз цикл слежения и закрывается.

Добавлено: 14 ноя 2005, 12:43
Maverick
при использовании Always ?

Добавлено: 14 ноя 2005, 12:56
DarkAngel27
Да

Добавлено: 14 ноя 2005, 13:00
Maverick
Код можно в студию?
(интересует как стартует таймер, где обработка Always, что там вызывается, и как стопается таймер)

Добавлено: 14 ноя 2005, 13:11
DarkAngel27
Я в Always написал саму функцию. Таймер при этом не стартуется. В этом нет смысла...

Добавлено: 14 ноя 2005, 13:16
DarkAngel27

Код: Выделить всё

Interface Name1;
Create view; 
file aFile;
var
   ST : string;
   flag : word;
   dir_name  : string;
   mask_name : string;
   file_name : string;

Panel pan_IMPORT;        
Screen sc_IMPORT;       
	show at(,,,);            
buttons
    cmOk,Default,, 'Закрыть интерфейс' ,,;
<<
                  
   <.Остановка.>

>>
end; //screen
HandleEvent
 cmOK :
   {
    CloseInterface(cmOK);
   }
end; // HandleEvent
end; //panel

HandleEvent
 Always
   {
    if findfirstfile(dir_name+mask_name, file_name) do
       {
    _try {        
          flag := 0;
          aFile.OpenFile (dir_name+file_name, stOpenRead);
          aFile.ReadLn(ST);
...
...
          if ST <> '' then flag := 1;
          aFile.Close;
          if flag = 1 then if DeleteFile(dir_name+file_name)=true then {...};
         }
    _except
      on ExFileNotFound :
         {
          message('Файл '+dir_name+file_name+' не найден или повреждён',2);
         };
       }while findnextfile(file_name);
   }
 cmInit:
   {
    dir_name := '\\server\dir';
    mask_name := '*.txt';
   }
end; // HandleEvent
end.
Сам код, как просили. Вместо многоточия идёт запись в БД.