Синхронизация в сервисе Windows

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

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

Синхронизация в сервисе Windows

Сообщение 1g0r » 05.11.2009 14:02:24

WinXP, FPC 2.2.4 , Lazarus 0.9.28.2

Для создания сервиса использую пакет lazdaemon.
Не выполняется Synchronize для методов вторичного потока. Во вложении тестовый пример.
На bugtracker такой проблемы не нашел, на форуме тоже. Может конечно я что-то не допонимаю, может какая фича :?: ...
Эта проблема не позволяет использовать в сервисах ряд библиотек, например: fblib, zeoslib.

Может кто подскажет как лечить или где копать.
Спасибо.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
1g0r
незнакомец
 
Сообщения: 2
Зарегистрирован: 05.11.2009 13:29:09

Re: Синхронизация в сервисе Windows

Сообщение Bupyc » 05.11.2009 14:35:53

Посмотри, задана ли переменная WakeMainThread. Она находится в модуле Classes. В ней должна храниться ссылка на метод объекта, который каким то образом дёргает главный поток приложения и передаёт ему ссылку на метод, который надо исполнить. Если она равна NIL, то Synchronize работать точно не будет. Если не NIL, то надо смотреть, ссылка на что лежит в WakeMainThread и как это всё работает.

Добавлено спустя 13 минут 13 секунд:
Я сталкивался с подобной ситуацией в Delphi. Synchronize перестаёт работать, если приложение не использует библиотеку VCL. В этом случае нужно делать некие телодвижения, что бы инициализировалась переменная WakeMainThread. Т.к. в заголовке своего сообщения, ты написал, что работаешь с WinXP, то можешь попробовать использовать мой модуль, который скорее всего решит твою проблему. Его нужно просто прикомпилировать к приложению добавив в секцию uses в *.lpr. Модуль писался для дельфей, но, думаю, что и в FPC он должен заработать без проблем.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Синхронизация в сервисе Windows

Сообщение 1g0r » 05.11.2009 17:00:54

Cпасибо за ответ....

Да действительно WakeMainThread ревен nil
Поискав по исходникам FPC, не нашел места где бы он инициализировался....
Пробовал использовать твой модуль, проблемы таки есть :) в AllocateHWnd
В FPC он реализован таким образом
Код: Выделить всё
function AllocateHWnd(Method: TWndMethod): HWND;
  begin
    { dummy }
    runerror(217);
    Result:=0;
  end;

(в общем не реализован)
Но направление поиска я получил, еще раз спасибо
1g0r
незнакомец
 
Сообщения: 2
Зарегистрирован: 05.11.2009 13:29:09

Re: Синхронизация в сервисе Windows

Сообщение Bupyc » 05.11.2009 17:52:34

Если WakeMainThread = NIL, то вернее всего это не баг, это фича :) Т.е. так и должно быть. Хотя, когда я реанимировал Synchronize в WinMobile'овской версии LCL, это всё таки был баг :) Что бы мой модуль скомпилировался, можно попробовать взять функции AllocateHwnd и DeAllocateHwnd из дельфей. Они, на первый взгляд, вроди бы без какой-либо привязки к VCL реализованы.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Синхронизация в сервисе Windows

Сообщение Angel_19 » 12.07.2014 00:15:57

Похожая проблема, как ее решить?
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47

Re: Синхронизация в сервисе Windows

Сообщение iN0k » 14.07.2014 11:35:09

На мой взгляд тут не целевое использование метода Synchronize связанное с не пониманием.
Когда мы пишем оконное приложение у нас ВСЕГДА есть ОЧЕВИДНЫЙ главный поток (который разгребает очередь сообщений приложения и завершение которого влечет за собой закрытие приложения). Именно в нем и "выполняется" Synchronize, который необходим для нормальной работы в условиях "однопоточности VCL".
В сервисах же такого потока НЕТ. Сам "сервис" построен на других принципах взаимодействия с системой. Поэтому Synchronize тут и не должен работать. Можно втащить VCL в сервис (что на мой взгляд не правильно, так как это ошибка архетиктуры ПО), но есть более элегантные методы.

а лучше поучить матЧасть ... и показать где я не прав :-)
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Синхронизация в сервисе Windows

Сообщение hinst » 14.07.2014 18:48:52

Не получается выполнить Synchronize, ну ладно, а нужно ли это делать? и зачем это делать? синхронизировать что с чем собрались?
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Синхронизация в сервисе Windows

Сообщение Angel_19 » 16.07.2014 22:44:35

hinst писал(а):Не получается выполнить Synchronize, ну ладно, а нужно ли это делать? и зачем это делать? синхронизировать что с чем собрались?

Разные потоки внутри сервиса.
Angel_19
новенький
 
Сообщения: 37
Зарегистрирован: 24.06.2014 17:29:47


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 242

Рейтинг@Mail.ru