Вверх ↑
Этот топик читают: Гость
Ответов: 23
Рейтинг: 0
#1: 2009-10-10 21:36:59 ЛС | профиль | цитата
Похоже компоненты TCP, некорректно работают в невизуальных приложениях, вернее сокет открывается и даже соединение устанавливается, но данные не принимаются. Есть подозрение что это связано с обработкой событий WinSock через сообщения винды (файл TCP.pas), но разобраться чего-то не получается где проблема. Проверял на XP, Win2000, win 2003.
Вот примерчик, просто как иллюстрация консольная программа которая отправляет пакет тестовому серверу (визуальное приложение) и должна выводить ответ в консоли.
Консольная программа
code_15208.txt



а это сервер к которому она обращается
code_15209.txt

Все начинает работать если просле открытия сокета в консольной программе вызвать какой-нибудь диалог:
code_15210.txt

Может кто поможет с этой проблемой? А то уже изобрел извращеный метод с запуском и скрытием диалога .

карма: 0

0
файлы: 3code_15208.txt [1.2KB] [159], code_15209.txt [1.1KB] [154], code_15210.txt [681B] [151]
Главный модератор
Ответов: 2999
Рейтинг: 396
#2: 2009-10-10 21:43:58 ЛС | профиль | цитата
Можно поискать по форуму была тема. Общий вывод - да есть проблема, да надо исправлять - результат: до сих пор не поправлено. Совет: если надо рабочую схему, то установите компонент из версии HiAsm b168 - тогда ещё компонент работал как сервис.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Ответов: 23
Рейтинг: 0
#3: 2009-10-11 14:58:50 ЛС | профиль | цитата
Понятно, спасибо за совет попробую, и буду дальше копать...
карма: 0

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#4: 2009-10-11 20:52:59 ЛС | профиль | цитата
Есть идея, что надо сделать на основе версии компонента из b168 самостоятельный компонент для работы с сервисом и консолью.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Администрация
Ответов: 15295
Рейтинг: 1519
#5: 2009-10-11 22:32:11 ЛС | профиль | цитата
а так работает?
code_15222.txt

карма: 27
0
файлы: 1code_15222.txt [652B] [260]
Ответов: 23
Рейтинг: 0
#6: 2009-10-12 20:55:38 ЛС | профиль | цитата
А ведь с doLoopMessage работает! По крайней мере для консоли. Спасибо!
На работе проверю на рабочем проекте и для сервиса. Все гениальное просто оказывается, а то я уже начал ваять компонент на основе Xsocket для KOL, с сайта библиотеки. Там кстати есть адаптация Indy под KOL...


карма: 0

0
Администрация
Ответов: 15295
Рейтинг: 1519
#7: 2009-10-13 08:48:37 ЛС | профиль | цитата
в приложениях "Сервис" этот цикл уже встроен и если timeout ставить больше нуля, то он будет периодически срабатывать.

PS: однако в будущем все равно надо будет сделать работу с сокетами на основе потоков, т.к. существующее решение не оптимально с точки зрения производительности.
карма: 27
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#8: 2009-10-13 09:00:55 ЛС | профиль | цитата
Alex35567 писал(а):
По крайней мере для консоли

Вчера попробовал такое замутить с сервисом. У меня -- не получилось. Самое интересное, что поток прекрасно отрабатывает асинхронный режим, а вот синхронный совершенно не хочет. Пробовал подцепить UDP (про это был уже разговор) -- ноль эмоций, синхронный режим с doLoopMessage не отработал. А, кстати, почему на событие из асинхронного режима чтения стоит ремарка, а само событие переведено в синхронный режим
------------ Дoбавленo в 09.02:
Вот схемка экспериментального сервиса



Add(NTService,2953706,119,182)
{
Description="Probe"
RunType=0
link(onStart,15354477:doEvent1,[(166,188)(166,132)])
link(onStep,6850796:doLoopMessages,[(167,195)(167,272)])
link(onStop,16084413:doEvent1,[])
}
Add(Application,6850796,217,259)
{
Point(doLoopMessages)
}
Add(Message,15111937,343,126)
{
Caption="Service"
}
Add(Hub,15354477,175,126)
{
link(onEvent1,12839073:doOpen,[])
link(onEvent2,6197093:doMessage,[])
}
Add(Message,6197093,217,133)
{
Message="Probe"
Caption="Start Service"
}
Add(Hub,16084413,175,196)
{
link(onEvent1,12839073:doClose,[(263,202)(263,153)])
link(onEvent2,7827722:doMessage,[(203,209)(203,230)])
}
Add(Message,7827722,217,224)
{
Message="Probe"
Caption="Stop Service"
}
Add(UDP,12839073,294,126)
{
LocalPort=1002
link(onReceive,15111937:doMessage,[])
}

------------ Дoбавленo в 09.04:
Запускной модуль



Add(MainForm,2953706,245,301)
{
Point(onClose)
}
Add(ServiceTools,5595634,252,154)
{
Name="MyService"
FileName="Probe_Service_2.exe"
link(onExecService,2080226:doMessage,[])
}
Add(Button,3718714,126,168)
{
Left=25
Top=15
TabOrder=-1
Caption="Install"
link(onClick,5595634:doInstall,[])
}
Add(Button,9106985,126,203)
{
Left=95
Top=15
TabOrder=-1
Caption="UnInstall"
link(onClick,5595634:doUninstall,[(205,209)(205,181)])
}
Add(Message,2080226,350,161)
{
Message="Done"
Caption="Probe"
}
Add(Button,8522530,126,98)
{
Left=25
Top=40
TabOrder=-1
Caption="Start"
link(onClick,5595634:doStart,[(205,104)(205,160)])
}
Add(Button,14929074,126,133)
{
Left=95
Top=40
TabOrder=-1
Caption="Stop"
link(onClick,5595634:doStop,[(205,139)(205,167)])
}
Add(Button,10939046,231,238)
{
Left=95
Top=65
TabOrder=-1
Caption="Send"
Data=String(Привет!)
link(onClick,6520829:doSend,[(331,244)(331,230)])
}
Add(Button,980539,231,203)
{
Left=25
Top=65
TabOrder=-1
Caption="Connect"
link(onClick,6520829:doOpen,[(331,209)(331,223)])
}
Add(UDP,6520829,350,217)
{
LocalPort=1001
RemotePort=1002
RemoteIP="127.0.0.1"
AutoConnect=0
ReceiveMode=1
}

------------ Дoбавленo в 11.08:
Вспомнил, оказывается некому посылать CM_EXECPROC для вызова синхронного события. Млин... и тут косяк.
------------ Дoбавленo в 12.42:
Порылся и нашел, что надо искать реализацию CheckSynchronize, которая не использует оконных обработчиков и применяется в Delphi, начиная с 6-го, вот она-то, как раз, и вызывает события из основного потока
карма: 22

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#9: 2009-10-13 14:31:40 ЛС | профиль | цитата
Кому интересно, то вот такое работает в сервисах


Add(NTService,4861962,231,273)
{
Description="Probe"
RunType=0
link(onStart,15354477:doEvent1,[(275,279)(275,223)])
link(onStop,16084413:doEvent1,[(275,293)(275,349)])
}
Add(Message,15111937,525,217)
{
Caption="Service"
}
Add(Hub,15354477,287,217)
{
OutCount=3
link(onEvent1,12839073:doOpen,[])
link(onEvent2,6197093:doMessage,[(315,230)(315,244)])
link(onEvent3,13847578:doStart,[(310,237)(310,286)])
}
Add(Message,6197093,329,238)
{
Message="Probe"
Caption="Start Service"
}
Add(Hub,16084413,287,343)
{
OutCount=3
link(onEvent1,12839073:doClose,[(415,349)(415,244)])
link(onEvent2,7827722:doMessage,[(319,356)(319,370)])
link(onEvent3,13847578:doStop,[(311,363)(311,293)])
}
Add(Message,7827722,329,364)
{
Message="Probe"
Caption="Stop Service"
}
Add(UDP,12839073,427,217)
{
LocalPort=1002
ReceiveMode=1
link(onReceive,1574250:doCase,[])
}
Add(Thread,13847578,329,280)
{
Delay=50
link(onExec,12839073:doReceive,[(394,286)(394,237)])
}
Add(Case,1574250,476,217)
{
Value=String()
link(onNextCase,15111937:doMessage,[])
}

карма: 22

1
Голосовали:Konst
Ответов: 4641
Рейтинг: 334
#10: 2009-10-13 15:23:42 ЛС | профиль | цитата
nesco писал(а):
Кому интересно, то вот такое работает в сервисах

в вики бы записать это
описать суть проблеммы, если таковая имеется.
карма: 1
Время верстки: %cr_time% Текущее время: %time%
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#11: 2009-10-13 15:43:14 ЛС | профиль | цитата
Ravilr писал(а):
в вики бы записать это

О то, пока никуда ничего писать не надо. Это требует дополнительных исследований. Посмотрим, что скажет Nic или tsdima, они юзают сервисы
------------ Дoбавленo в 15.55:
А вот так можно сделать, синхронизированный с событием самого сервиса, режим чтения, используя критические секции



Add(NTService,4861962,231,273)
{
Description="Probe"
RunType=0
link(onStart,15354477:doEvent1,[(275,279)(275,223)])
link(onStep,16420265:doSafeMode,[(294,286)(294,321)])
link(onStop,16084413:doEvent1,[(275,293)(275,349)])
}
Add(Message,15111937,644,322)
{
Caption="Service"
}
Add(Hub,15354477,287,217)
{
OutCount=3
link(onEvent1,12839073:doOpen,[])
link(onEvent2,6197093:doMessage,[(315,230)(315,244)])
link(onEvent3,13847578:doStart,[(310,237)(310,286)])
}
Add(Message,6197093,329,238)
{
Message="Probe"
Caption="Start Service"
}
Add(Hub,16084413,287,343)
{
OutCount=3
link(onEvent1,12839073:doClose,[(452,349)(452,244)])
link(onEvent2,7827722:doMessage,[(319,356)(319,370)])
link(onEvent3,13847578:doStop,[(311,363)(311,293)])
}
Add(Message,7827722,329,364)
{
Message="Probe"
Caption="Stop Service"
}
Add(UDP,12839073,462,217)
{
LocalPort=1002
ReceiveMode=1
link(onReceive,13200461:doValue,[])
}
Add(Thread,13847578,329,280)
{
Delay=50
link(onExec,6938609:doSafeMode,[])
}
Add(Case,1574250,567,315)
{
Value=String()
link(onNextCase,16206402:doEvent1,[])
}
Add(SafeMode,6938609,378,280)
{
link(onSafeMode,12839073:doReceive,[(433,286)(433,237)])
}
Add(Memory,13200461,518,217)
{
Default=String()
}
Add(SafeMode,16420265,462,315)
{
WaitMode=1
link(onSafeMode,2661767:doData,[])
}
Add(DoData,2661767,518,315)
{
link(onEventData,1574250:doCase,[])
link(Data,13200461:Value,[])
}
Add(Hub,16206402,609,315)
{
link(onEvent1,13200461:doClear,[(635,321)(635,201)(504,201)(504,230)])
link(onEvent2,15111937:doMessage,[])
}

карма: 22

0
Главный модератор
Ответов: 2999
Рейтинг: 396
#12: 2009-10-13 20:15:37 ЛС | профиль | цитата
nesco писал(а):
Посмотрим, что скажет Nic


Мне, несколько месяцев назад, пришлось заменить сервис, сделанный в HiAsm b168, на приложение компилированное в REALbasic. Сервис работал года два, но несмотря на все заплаты к нему (постоянное самотестирование) зависал периодически: раз в несколько дней, если у него было мало работы и несколько раз в день, если работы было много. Прямо сейчас, тестированием заниматься не могу: к пакету vbs ещё много надо приложить усилий, чтобы о нём хоть что-то можно было сказать.
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)