Netspirit писал(а):
AutoReceive=False, чтобы зря каждый раз не создавало поток чтения данных
А когда запустится поток чтения данных?
Ответов: 655
Рейтинг: 18
|
|||
Netspirit, спасибо!
Netspirit писал(а): AutoReceive=False, чтобы зря каждый раз не создавало поток чтения данных
А когда запустится поток чтения данных? |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
При AutoReceive=True запускается сразу после успешного подключения. Иначе вручную нужно вызвать doStartReceiving.
Редактировалось 2 раз(а), последний 2017-03-08 11:58:13 |
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Netspirit, спасибо!
|
|||
карма: 0 |
|
Ответов: 817
Рейтинг: 52
|
|||
nesco писал(а):
-= DriveR =- писал(а): Думаю не стОит сомневаться, надо добавлять Решение Автора -- закон Netspirit писал(а): Давай пока пусть месяца два полежат. Пусть народ попробует их в реальных приложениях. Времени прошло значительно больше чем пара месяцев, еще не принято решение о добавлении этих компонентов в стандартную палитру? |
|||
карма: 1 |
|
Разработчик
Ответов: 26113
Рейтинг: 2126
|
|||
-= DriveR =- писал(а): Времени прошло значительно больше чем пара месяцев, еще не принято решение о добавлении этих компонентов в стандартную палитру?Там автор все еще что-то шерстит. |
|||
карма: 22 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Ну, уже вроде как бы всё устаканилось. Но, конечно, ещё будут доработки.
|
|||
карма: 26 |
|
Ответов: 578
Рейтинг: 14
|
|||
Этот компонент только со String работает, Stream нельзя?
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Нет. Реализация собственных протоколов для отправки произвольных данных - /topic/65137
|
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Netspirit, Если не затруднит объясни пожалуйста про потоки внутри сервера и клиента.
Собственно мне требуется на клиенте проверять наличие новых данных в БД, затем паковать их и отправлять на сервер. Одно из условий - пока сервер обрабатывает полученный пакет от клиента, клиент не должен слать последующие пакеты. Когда сервер обработает пакет он отключит клиента, собственно после отключения можно будет повторно подключиться и отправить следующие данные. Такая схема с отключением\подключением сделана ввиду того что данные шлются в HTTP POST запросах, ну и потому что появляются они не часто и удерживать соединение не имеет смысла. Вопрос по потокам следующий: Какие события происходят в одном потоке а какие в разных? onConnect\onDisconnect это события одного потока? onReceive - другого? Правильно ли в моей схеме используется критическая секция?
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Gunnman писал(а): Какие события происходят в одном потоке а какие в разных?События onConnect/onErrorConnect происходят либо в потоке, вызвавшем doConnect (при AsyncConnect=False), либо в параллельном потоке (при AsyncConnect=True) События onSend/onErrorSend происходят либо в потоке, вызвавшем doSend, либо в параллельном потоке после doSendAsync Событие onReceive происходит в параллельном потоке чтения данных, onClientConnect - в параллельном потоке приёма подключений. Событие onDisconnect/onClientDisconnect происходит либо в потоке, вызвавшем doDisconnect, либо в параллельном потоке чтения данных. Поскольку прием данных и асинхронную отправку обслуживают по несколько параллельных потоков, то источником одного события в разное время могут быть разные потоки. Но, так как точка события одна, то нужно считать, что оно просто происходит в параллельном потоке (а каком именно - для автора схемы не имеет значения). Если свойство AsyncEvents=False, то все перечисленные события, происходящие в параллельных потоках, вызываются из главного потока приложения (очереди сообщений). Для невизуальных приложений (не имеющих очереди сообщений), AsyncEvents всегда True. Gunnman писал(а): Правильно ли в моей схеме используется критическая секция?Редактировалось 4 раз(а), последний 2017-04-20 16:20:05 |
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Для невизуальных приложений (не имеющих очереди сообщений), AsyncEvents всегда True. Как быть с сетевыми контроллерами которые на каждую принятую команду отвечают что-либо? У меня происходит следующее - есть массив команд которые нужно послать по очереди (шлю через перебором через ArrayEnum), если AsyncEvents=False то контроллер отрабатывает все команды и на каждую отвечает, если AsyncEvents=True то ответы получаю не на все отправленные команды.. --- Добавлено в 2017-04-20 22:21:52 И еще вопросы: 1) Есть поток с задержкой 1000ms, он вызывает подключение к серверу и отправку данных. Например данных оказалось больше или скорость канала просела и за 1000ms мы не успеваем отправить, что в этом случае происходит с потоком по истечению 1000ms? 2) Нужно ли использовать асинхронные события? Можно какой-нибудь пример ситуации для чайников)) Редактировалось 3 раз(а), последний 2017-04-20 22:22:14 |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Gunnman писал(а): если AsyncEvents=True то ответы получаю не на все отправленные командыПри AsyncEvents=True (или при переборе команд с вызовом doSend не из главного потока) событие onReceive может произойти в процессе перебора - ты шлешь очередную команду очередному клиенту и в это самое время может произойти событие onReceive как ответ от предыдущего клиента. Мне кажется, тут нужно менять логику в схеме для реализации "запрос-ответ". Это не принципиально зависит от AsyncEvents - в любом случае тебе нужно дождаться прихода ответа, причем, в правильном порядке. Сделать это можно так. Специальный паралельный поток сбрасывает событие (компонент Events) затем шлет одну команду и останавливается на ожидание срабатывания события (компонент WaitObject). Событие onReceive выполняет необходимую обработку ответа, а затем сигналит то же событие Events, позволяя отправляющему потоку продолжить исполнение и отправить следующую команду. Gunnman писал(а): что в этом случае происходит с потоком по истечению 1000ms?Но тут есть одна проблемка: у сокета есть свой буфер. И если при отправке в буфере есть свободное место, то новые данные будут записаны в буфер, метод doSend/doSendAsync отработает сразу, событие onSend будет получено. При этом, не факт что клиент эти данные получит: если после этого глюкнет сеть или клиент отключится, то мы получим событие onDisconnect (поток приема данных обнаружит ошибку чтения сокета, хотя, возможно, и не всегда), но мы не сможем узнать сколько реально клиент смог принять данных из буфера перед обрывом. Отправка следующих данных выдаст onErrorSend. Если в буфере при отправке нет свободного места, отправляющий поток приостановится до освобождения буфера. Редактировалось 2 раз(а), последний 2017-05-25 11:27:00 |
|||
карма: 26 |
| ||
Голосовали: | Gunnman |
Ответов: 655
Рейтинг: 18
|
|||
Если данные отправляются из главного потока (например, по командах обычного таймера)
при переборе команд с вызовом doSend не из главного потока
Запутался... Правильно я понимаю что главный поток - это поток который создается системой при запуске ПО, далее из него мы можем вызывать уже дочерние потоки? В таймерах и компоненте Thread есть задержка между итерациями, а как устроен главный поток? Грубо говоря запустили мы программу...главный поток вызвал какую-то функцию, цепочка событий началась. У него так же есть задержка? п.с. спасибо за терпение, вы очень интересно объясняете)) |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Gunnman писал(а): Запутался...Gunnman писал(а): Правильно я понимаю что главный поток - это поток который создается системой при запуске ПОGUI ("оконное") приложение реализует в этом цикле с помощью функций Windows выборку оконных сообщений, передачу их на обработку созданным в этом приложении окнам. Обычно, этот цикл завершается, когда будет закрыто первое созданое приложением окно (а точнее, в очередь сообщений будет послано сообщение WM_QUIT). Если посмотреть исходный код проектов Delphi, то можно увидеть, что сначала создается главное окно, а затем вызывается процедура Application.Run(), содержащая такой цикл. А пользователь уже управляет приложением, используя элементы управления в главном и других окнах. Всё, что он нажимает в окнах, попадает в виде сообщения в главный цикл, тот передаёт его оконной процедуре окна, в котором оно произошло, а она ищет обработчик, назначенный программистом для данного сообщения (например, в панели событий Delphi IDE). Gunnman писал(а): У него так же есть задержка?Gunnman писал(а): В таймерах и компоненте Thread есть задержка между итерациямиРедактировалось 2 раз(а), последний 2017-05-25 11:31:56 |
|||
карма: 26 |
|
Ответов: 655
Рейтинг: 18
|
|||
Netspirit писал(а): Сделать это можно так. Специальный паралельный поток шлет одну команду затем сбрасывает событие (компонент Events) и останавливается на ожидание его срабатывания (компонент WaitObject). Событие onReceive выполняет необходимую обработку ответа, а затем сигналит то же событие Events, позволяя отправляющему потоку продолжить исполнение и отправить следующую команду.
п.с. а Events можно использовать с паралельным потоком? |
|||
карма: 0 |
|