TDaemon и синхронизация

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TDaemon и синхронизация

Сообщение Angel_19 » 13.11.2014 10:57:07

Разработка службы для Windows.

Создаю дополнительно отдельный поток. Он исправно работает, пока дело не доходит до синхронизации - она не работает.
Поток:
Код: Выделить всё
TServiceThread = Class(TThread)
  Public
    Constructor Create();
    destructor Destroy; override;
    Procedure Execute; override;
    Procedure Syn;
  end;

{ TServiceThread }

constructor TServiceThread.Create;
begin
    FreeOnTerminate:=True;
    AddLog('Thread - Create', etDebug);
    Inherited Create(False);
end;

destructor TServiceThread.Destroy;
begin
    AddLog('Thread - Destroy', etDebug);
    inherited Destroy;
end;

procedure TServiceThread.Execute;
begin
     AddLog('Thread - Execute START', etDebug);
     Repeat
       AddLog('Thread - tick', etDebug);
       sleep(1000*60*2); // 2 минуты
       Synchronize(@Syn);// - тут работа этого потока останавливается!!!
     Until Terminated;
     AddLog('Thread - Execute STOP', etDebug);
end;

procedure TServiceThread.Syn;
begin
    AddLog('Проверяем не закрыта ли программа, и запускаем если нужно.', etInfo);
    DaemonS.RunClientAllSessionID;
end;


Что делаю не так?
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: TDaemon и синхронизация

Сообщение wavebvg » 13.11.2014 11:30:43

Как у Вас обстоят дела с циклом обработки сообщений в основном потоке? С которым Вы пытаетесь синхронизоваться.
Вообще, абстрактный (в смысле не делаюший ничего практичного) поток, приведенный Вами, прекрасно работает. Проблема явно не в нем.
Да и для дерганья каждые две минуты вполне бы подошел обычный таймер.
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: TDaemon и синхронизация

Сообщение Angel_19 » 13.11.2014 12:02:14

Да и для дерганья каждые две минуты вполне бы подошел обычный таймер.

Таймер в службе без ухищерений не сделать, т.к. в службе нет форм.
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: TDaemon и синхронизация

Сообщение uchar » 13.11.2014 14:17:32

В службах/демонах вместо TThread.Synchronize нужно использовать критические секции/мьютексы, например (таймер также
поправлен):

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

var
   Lock: TCriticalSection; // Глобальная переменная

procedure TServiceThread.Execute;
var
  StartTime, Ticks: DWORD;
begin
  AddLog('Thread - Execute START', etDebug);
  StartTime := GetTickCount;
  Repeat
    Sleep(10);
    Ticks := GetTickCount;
    if Ticks - StartTime > 1000*60*2 then // 2 минуты
    begin
      AddLog('Thread - tick', etDebug);
      //sleep(1000*60*2); // 2 минуты
      //Synchronize(@Syn);// - тут работа этого потока останавливается!!!
      FLock.Acquire;
      try
        Syn;
      finally
         Lock.Leave;
      end;
      StartTime := Ticks;
    end;
  Until Terminated;
  AddLog('Thread - Execute STOP', etDebug);
end;

initialization
  Lock := TCriticalSection.Create;
finalization
  Lock.Free;
uchar
незнакомец
 
Сообщения: 5
Зарегистрирован: 10.03.2011 18:46:12

Re: TDaemon и синхронизация

Сообщение Angel_19 » 13.11.2014 16:15:31

Спасибо!
Сделал.
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240

Рейтинг@Mail.ru
cron