Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

TThread.Suspend и TWinSocketStream.TimeOut   Найти похожие ветки 

 
neteditor ©   (2004-06-02 20:31) [0]

Подскажите, как реагирует TWinSocketStream на Suspend "несущей" его нити? Одолевают смутные подозрения что не совсем так, как надо. И касается это, в основном подозрений насчет того, что отсылающая сторона тоже имеет таймауты. Просветите темного :)


 
Digitman ©   (2004-06-03 08:22) [1]

никак не реагирует.

потому что как только "несущая" нить переходит в Suspend-состояние, ни одна ее маш.инструкция не выполняется процессором - ни инструкции в составе кода объекта WinSocketStream, ни какие бы то ни было иные

если нить отсылающей стороны не "спит" и послала что-то в этот момент (хоть с таймаутом, хоть без оного), то "спящее" состояние нити принимающей стороны на это до поры до времени никак не влияет - фактический прием данных на канальном уровне ведет не "спящая" нить (это прикладной уровень), а система, которая никогда не спит и которая принимает-накапливает вх.поток во внутренних буферах приема (общий размер которых, разумеется, ограничен)

как только принимающая нить будет разбужена, она сможет прочитать все доступные пришедшие на этот момент данные


 
neteditor ©   (2004-06-04 13:27) [2]

Если я правильно понял, то таймаут TWinSocketStream не привязан к системному времени, а исключительно к времени выполнния кода самого объекта WinSocketStream?

Может, и не по теме, но все же


>... накапливает вх.поток во внутренних буферах приема (общий
> размер которых, разумеется, ограничен)...

Получается, что этот буфер общий для всех принимающих программ (поскольку он системный). И если я "усыплю" нить, принмающую побольше, то могу "убить" остальные принимающие программы?

Где можно узнать или изменить размер этого буфера, если это вообще возможно?

p.s. Огромное спасибо за ответ [1].


 
Digitman ©   (2004-06-04 13:59) [3]


> Если я правильно понял, то таймаут TWinSocketStream не привязан
> к системному времени, а исключительно к времени выполнния
> кода самого объекта WinSocketStream?


нет, к абсолютному сист.времени не привязан, таймаут - относительное понятие, в дан.случае он задается в миллисекундах (условно в мс, потому что одна мс программного таймаута лишь приблизительно равна миллисекунде как ед-це изм-я времени) и отражает время ожидания события ввода/вывода с момента вызова метода WaitFor


> Получается, что этот буфер общий для всех принимающих программ
> (поскольку он системный).


нет, для каждой гнезда система создает отдельный буфер (точнее сказать - цепочку буферов, образующих кольцевую очередь ввода/вывода на канальном уровне)


> если я "усыплю" нить, принмающую побольше, то могу "убить"
> остальные принимающие программы?


нет, на иные программы это никак не повлияет


> Где можно узнать или изменить размер этого буфера, если
> это вообще возможно?


зачем тебе это нужно ? не трогай канальный уровень, лучше сосредоточься на оптимизации алгоритма принимающей стророны, чтобы минимизировать ситуации, когда долгое время нет чтения из из гнезда

мне вообще непонятно, чем у тебя вызвана необходимость "усыпления" потока, поясни это ...


 
neteditor ©   (2004-06-04 15:06) [4]

Связано это с ограничением пропускной способности в нашей сети.

А задача простая - нужно получить определенную информацию с разных серверов (причем их довольно много). При этом заранее неизвестен ни размер ответа ни время его поступления (сервер может ответить с задержкой в пределах до 10 сек).

Вот я и ищу выход. Ведь если ответит сразу несколько срверов - пропускной способности не хватит. Может, я не там ищу?

p.s. Прием по очереди отмели сразу, как не рациональное решение с точи зрения затрат времени


 
Digitman ©   (2004-06-04 15:38) [5]


> Связано это с ограничением пропускной способности в нашей
> сети


не вижу никакой связи

поток вполне может не "спать" (находиться в kernel-time, например, вызывав одну из системных ф-ций ожидания сообщений/событий) и при этом, не отнимая процессорного времени, мгновенно реагировать на сигналы системы о каких-то событиях (в дан.случае, например, транспортных, т.е. событие поступления очер.порции данных от передающей стороны)


> При этом заранее неизвестен ни размер ответа ни время его
> поступления (сервер может ответить с задержкой в пределах
> до 10 сек).


ну с задержкой ответа - это понятно, даже при идеальной проп.способности делать ставку на фикс.время ответа нельзя

а вот с неизвестностью "размера ответа" - это что-то новенькое .. как же у тебя вообще общяются клиенты и серверы. если протокол инф.обмена между ними не оговаривает конкретный формат сообщений ? даже если предположить, что обмен предполагает передачу простых нуль-терминированых строк, то и в этом простом случае принимающая сторона считает, что сообщение принято целиком, когда принят нуль-терминатор..


 
neteditor ©   (2004-06-04 16:21) [6]


> поток вполне может не "спать" (находиться в kernel-time,
> например, вызывав одну из системных ф-ций ожидания сообщений/событий)
> и при этом, не отнимая процессорного времени, мгновенно
> реагировать на сигналы системы о каких-то событиях (в дан.случае,
> например, транспортных, т.е. событие поступления очер.порции
> данных от передающей стороны)

Так и сделаю.

Не совсем точно выразил мысль по поводу размера. Он неизвестн ЗАРАНЕЕ. А в самой посылке он указывается.

Спасибо за ответы.


 
Digitman ©   (2004-06-04 16:35) [7]


> Он неизвестн ЗАРАНЕЕ. А в самой посылке он указывается.


значит известен

т.е. в ран-тайм , согласно твоего протокола инф.обмена, перед блоком данных нефикс.размера передаются данные фикс.размера, являющие собой префикс, отражающий размер следующего за префиксом инф.блока

когда размер префикса ЗАРАНЕЕ известен, все остальное - дело техники



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.441 c
14-1090558974
Керик
2004-07-23 09:02
2004.08.08
Писать и читать


3-1089613967
VadimKV
2004-07-12 10:32
2004.08.08
Update на основе данных другой таблицы???


1-1090562943
ilgam
2004-07-23 10:09
2004.08.08
Вопрос по потокам: создание компопнента в потоке


1-1090974268
Господин со спичками
2004-07-28 04:24
2004.08.08
СРОЧНО - Как "занять" место на экране подобно Панели Задач?


4-1088443568
Vasya.ru
2004-06-28 21:26
2004.08.08
Как программно перезагрузить Windows?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский