Похоже компоненты TCP, некорректно работают в невизуальных приложениях, вернее сокет открывается и даже соединение устанавливается, но данные не принимаются. Есть подозрение что это связано с обработкой событий WinSock через сообщения винды (файл TCP.pas), но разобраться чего-то не получается где проблема. Проверял на XP, Win2000, win 2003.
Вот примерчик, просто как иллюстрация консольная программа которая отправляет пакет тестовому серверу (визуальное приложение) и должна выводить ответ в консоли.
Консольная программа
code_15208.txt
а это сервер к которому она обращается
code_15209.txt
Все начинает работать если просле открытия сокета в консольной программе вызвать какой-нибудь диалог:
code_15210.txt
Может кто поможет с этой проблемой? А то уже изобрел извращеный метод с запуском и скрытием диалога .
Этот топик читают: Гость
Ответов: 23
Рейтинг: 0
|
|||
карма: 0 |
| ||
файлы: 3 | code_15208.txt [1.2KB] [159], code_15209.txt [1.1KB] [154], code_15210.txt [681B] [151] |
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Можно поискать по форуму была тема. Общий вывод - да есть проблема, да надо исправлять - результат: до сих пор не поправлено. Совет: если надо рабочую схему, то установите компонент из версии HiAsm b168 - тогда ещё компонент работал как сервис.
|
|||
карма: 6 |
|
Ответов: 23
Рейтинг: 0
|
|||
Понятно, спасибо за совет попробую, и буду дальше копать...
|
|||
карма: 0 |
|
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
Есть идея, что надо сделать на основе версии компонента из b168 самостоятельный компонент для работы с сервисом и консолью.
|
|||
карма: 6 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
карма: 27 |
| ||
файлы: 1 | code_15222.txt [652B] [260] |
Ответов: 23
Рейтинг: 0
|
|||
А ведь с doLoopMessage работает! По крайней мере для консоли. Спасибо!
На работе проверю на рабочем проекте и для сервиса. Все гениальное просто оказывается, а то я уже начал ваять компонент на основе Xsocket для KOL, с сайта библиотеки. Там кстати есть адаптация Indy под KOL... |
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
в приложениях "Сервис" этот цикл уже встроен и если timeout ставить больше нуля, то он будет периодически срабатывать.
PS: однако в будущем все равно надо будет сделать работу с сокетами на основе потоков, т.к. существующее решение не оптимально с точки зрения производительности. |
|||
карма: 27 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Alex35567 писал(а): По крайней мере для консолиВчера попробовал такое замутить с сервисом. У меня -- не получилось. Самое интересное, что поток прекрасно отрабатывает асинхронный режим, а вот синхронный совершенно не хочет. Пробовал подцепить UDP (про это был уже разговор) -- ноль эмоций, синхронный режим с doLoopMessage не отработал. А, кстати, почему на событие из асинхронного режима чтения стоит ремарка, а само событие переведено в синхронный режим ------------ Дoбавленo в 09.02: Вот схемка экспериментального сервиса
Запускной модуль
Вспомнил, оказывается некому посылать CM_EXECPROC для вызова синхронного события. Млин... и тут косяк. ------------ Дoбавленo в 12.42: Порылся и нашел, что надо искать реализацию CheckSynchronize, которая не использует оконных обработчиков и применяется в Delphi, начиная с 6-го, вот она-то, как раз, и вызывает события из основного потока |
|||
карма: 22 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Кому интересно, то вот такое работает в сервисах
|
|||
карма: 22 |
| ||
Голосовали: | Konst |
Ответов: 4641
Рейтинг: 334
|
|||
nesco писал(а): Кому интересно, то вот такое работает в сервисахв вики бы записать это описать суть проблеммы, если таковая имеется. |
|||
карма: 1 |
|
Разработчик
Ответов: 26170
Рейтинг: 2127
|
|||
Ravilr писал(а): в вики бы записать этоО то, пока никуда ничего писать не надо. Это требует дополнительных исследований. Посмотрим, что скажет Nic или tsdima, они юзают сервисы ------------ Дoбавленo в 15.55: А вот так можно сделать, синхронизированный с событием самого сервиса, режим чтения, используя критические секции
|
|||
карма: 22 |
|
Главный модератор
Ответов: 2999
Рейтинг: 396
|
|||
nesco писал(а): Посмотрим, что скажет Nic Мне, несколько месяцев назад, пришлось заменить сервис, сделанный в HiAsm b168, на приложение компилированное в REALbasic. Сервис работал года два, но несмотря на все заплаты к нему (постоянное самотестирование) зависал периодически: раз в несколько дней, если у него было мало работы и несколько раз в день, если работы было много. Прямо сейчас, тестированием заниматься не могу: к пакету vbs ещё много надо приложить усилий, чтобы о нём хоть что-то можно было сказать. |
|||
карма: 6 |
|
12