Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#91: 2007-08-21 11:47:12 ЛС | профиль | цитата
nesco писал(а):
а вот принимать чего-то не хочет

Надо разбираться, почему окна не создаются. В нашей реализации сокетов тоже используется невидимое окно для нотификации о пришедших данных. Видимо оно не создалось.

Насчёт отладки - видимо сначала придётся как обычное приложение делать (с учётом того, что потом будет только событие onStep) и отлаживать, а потом переносить в сервис.

[size=-2]------ Добавлено в 11:47
Dilma писал(а):
поскольку цикла приема передачи сообщений там не сделано

Цикл-то есть, только не работает это нифига почему-то.
карма: 1

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#92: 2007-08-21 12:23:47 ЛС | профиль | цитата
Dilma, спасибо за инфу, будем мучать дальше.

[size=-2]------ Добавлено в 11:53
tsdima писал(а):
с учётом того, что потом будет только событие onStep

Ну я тут не зря замутил ММТаймер, он работает в сервисе, я это проверял (правда на 1..5 сек, пока, ниже не проверял).

[size=-2]------ Добавлено в 12:23
Ага, вручную принимает. Получается, что потоковые данные приниматься не будут (не будет вызываться событие onExec), а у меня компонент построен на потоке. Я правильно понял, или чего-то не догнал? Кстати, ММТаймер работает и на мелких разрешениях (только что проверил).
карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#93: 2007-08-21 12:46:41 ЛС | профиль | цитата
tsdima, да действительно есть.

Вопрос такой: сейчас цикл обработки сообщений стоит внутри цикла ожидания чего-то(объект fStop), всвязи с чем непонятна логика работы этого куска.
- По идеи в цикле обработки сообщений мы висит всегда безвылазно. Тогда нотификации о смене статуса сервиса приходить не должны.
- Однако больше похоже на то, что из цикла таки мы вываливаемся(а не должны по идее). После чего в теории можем стопорится на строке WaitForSingleObject(). А уж если мы там встали, то никакие Windows сообщения проходить очевидно не будут. Скорей всего именно эту картину мы и наблюдаем.

[size=-2]------ Добавлено в 12:46
nesco писал(а):
не будет вызываться событие onExec

будет. Не будет вызываться onSyncExec - именно он работает через очередь
карма: 26
0
Ответов: 9906
Рейтинг: 351
#94: 2007-08-21 13:06:28 ЛС | профиль | цитата
Dilma писал(а):
onSyncExec - именно он работает через очередь

Вообще-то - нет, чeрез SendMessage
procedure TThread.Synchronize(Method: TThreadMethod);
begin
Global_Synchronized := CallSynchronized;
FMethod := Method;
if Applet <> nil then
SendMessage( Applet.fHandle, CM_EXECPROC, 0, Integer( @Self ) );
end;
Просто Applet-а никто не делал
карма: 9

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#95: 2007-08-21 13:57:26 ЛС | профиль | цитата
Всё это хорошо, но может быть пора уже включить компонент в дистрибутив. У себя на работе "замутил" десяток простеньких сервисов, работающих круглосуточно уже пару-тройку недель. Не всё гладко с некоторыми, но к самому компоненту притензий нет. На лицо - стабильность и простота в использовании. Плюс бонус - сама система следит за работой сервиса - если он "упал" Ось сама его запускает снова.

[size=-2]------ Добавлено в 13:57
Кстати, Timer на рассыпухе, работающий от onStep:
code_1851.txt
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1code_1851.txt [2.6KB] [463]
Администрация
Ответов: 15294
Рейтинг: 1518
#96: 2007-08-21 14:12:46 ЛС | профиль | цитата
Galkov писал(а):
Вообще-то - нет

Вообще-то - да. SendMessage посылает сообщение в очередь. Это только в *nix системах посылка сигналов между процессами идет напрямую без буферизации в очередях.

Nic писал(а):
но может быть пора уже включить компонент в дистрибутив

да включен уже с версии 164 как минимум. Достаточно скинуть на среду вот такой *.his файлик:

function run() {
  sys.addproject("delphi","NTService","Сервисы","Сервисы Windows","exe","make_service.dll");
}
карма: 26
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#97: 2007-08-21 14:15:39 ЛС | профиль | цитата
Nic, простенькие не интересно. Вот у меня нифига не пошел. Приложение работает прекрасно, а сервис не хочет, че и писаниной занимаемся-то. Не хватает обмена данными между приложениями и сервисом, да и потоки че-то не очень себя ведут.
карма: 22

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#98: 2007-08-21 14:23:49 ЛС | профиль | цитата
Мне пришлось от потоков избавиться вообще. Всё переделал на выше приведённом таймере.

[size=-2]------ Добавлено в 14:23
А "простенькие" - это так ... к слову. Один из них - это LogServer - сервис принимающий сообщения от других машин сети и записывающий их в MSSQL Server - круглосуточно, конечно, трафик у него не чета твоему, но ведь работает месяцами, а падает по методу "харакири", то есть у него внутри самопроверка стоит и он сам решает когда сделать себе "харакири" или kill process с известным ему ID.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 9906
Рейтинг: 351
#99: 2007-08-21 14:28:50 ЛС | профиль | цитата
Dilma писал(а):
Вообще-то - да. SendMessage посылает сообщение в очередь

Не посылает
MSDN/SendMessage писал(а):
If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.

карма: 9

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#100: 2007-08-21 14:29:50 ЛС | профиль | цитата
Кстати, приём сообщений ещё пока не делал, а вот посылаю сообщения через MailSlot - работает прекрасно.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#101: 2007-08-21 14:37:17 ЛС | профиль | цитата
Nic писал(а):
сервис принимающий сообщения от других машин сети

Ну вот работа с внешними портами компа, геморрой еще тот, да еще на разных скоростях, с разными кодировками и длинами посылок. Самое интересное, что разделенные на визуальное и невизуальное простые приложения работают, а вот в сервисе невизуальное -- не хочет, хоть ты лопни
карма: 22

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#102: 2007-08-21 14:44:34 ЛС | профиль | цитата
Мне пришлось для работы с сетевыми ресурсами переопределить Account под которым запускается сервис (LogOn), но с другой стороны у тебя же порты это локальные ресурсы.:?
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#103: 2007-08-21 14:52:13 ЛС | профиль | цитата
Nic, прикол в том, что штатный компонент COM-Port необходимо опрашивать в цикле, задавая количество считываемых байт. Прикинь, как часто необходимо опрашивать порт при скорости в 57600 и например 20 байтах информации, около 3 мсек. Получается сколько каналов, столько и таймеров. Я плюнул на этот тормоз и сделал COM-Port на потоке, но этот самый поток не хочет работать в сервисе, вот я и приплыл.
карма: 22

0
Администрация
Ответов: 15294
Рейтинг: 1518
#104: 2007-08-21 15:12:14 ЛС | профиль | цитата
Galkov писал(а):
If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure

хм. Одно из преимуществ очереди - синхронизация доступа. Если вместо посылки сообщений сразу вызывать оконную процедуру, возможен вариант одновременной обработки одного и тоже сообщения
карма: 26
0
Ответов: 9906
Рейтинг: 351
#105: 2007-08-21 15:27:00 ЛС | профиль | цитата
Dilma, ну ты чего такое говоришь-то
Messages sent between threads are processed only when the receiving thread executes message retrieval code


[size=-2]------ Добавлено в 15:27
Насколько я понял, красное, это попросту - GetMessage
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)