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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Juve
Постоянный гость
Сообщения: 60
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

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

Сообщение Juve »

Здравствуйте.
Есть задача написать цикл "слежения" за файликом. Если данные в нем изменяются, то галка должна вызвать определенный фейс.
Написал dll, однако цикл, её вызывающий из собственного фейса, понятное дело, вешает всю систему.
Есть какие либо мысли по этому поводу, может можно таймер как то установить и событие проверки периодически вызывать. Буду благодарен за любые предложения.
Juve
Постоянный гость
Сообщения: 60
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение Juve »

Проблема решилась, откопал нужную функцию

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

:D
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

ток не забывай его вовремя стопать )))
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

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

cmInit:
{
StartTimer(funс1,1,true);
....
}
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

StartTimer вещаем на cmInit
StopTimer вешаем на cmDone

а на cmIdle вешаем агента-следователя )))
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

StartTimer вещаем на cmInit
StopTimer вешаем на cmDone

а на cmIdle вешаем агента-следователя )))
А что подразумевается под агент-следователь?
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

ну функцию, которая бы отслеживала состояние файла :grin:
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

У меня именно так и сделано, о результате см. выше.
В описании VIP написано что cmIdle проходит сразу после сдвига записи по таблице (cmPosUp etc.), а у меня это может произойти 1 раз в 5 минут, соответственно это событие проходит задолго до обновления файлика. Из-за этого может не работать? И как это избежать?
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

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

Справочно:

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

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

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

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


Версия : Атлантис 3.03.03.
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Как ни странно, но Галактика закрывается без единого предупреждения :(
Отрабатывает порядком 10-15 раз цикл слежения и закрывается.
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

при использовании Always ?
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Да
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Сообщение Maverick »

Код можно в студию?
(интересует как стартует таймер, где обработка Always, что там вызывается, и как стопается таймер)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение DarkAngel27 »

Я в Always написал саму функцию. Таймер при этом не стартуется. В этом нет смысла...
DarkAngel27
Местный житель
Сообщения: 228
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение 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.
Сам код, как просили. Вместо многоточия идёт запись в БД.
Ответить