Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
ВнизПодскажите непонятливому!!!! Indy IdTCPClient - Найти похожие ветки
← →
tes (2003-08-06 18:29) [0]Помню раньше были компоненты TServerSocket TClientSocket, у клиента была такая тема как - ClientSocketRead, в Indy такого нет. Если ставить на таймер IdTCPClient.ReadLn то прога быстро уходит в мир иной (полное вислово) :( Подскажите каким образом нужно плучать ответы от IdTCPServer в клиенте. Задолбался уже.
← →
Reindeer Moss Eater (2003-08-07 08:36) [1]Если ставить на таймер IdTCPClient.ReadLn
Зачем на таймер? Почему не на тормоз?
IdTCPClient.ReadLn без таймера не работает что ли?
← →
$hade (2003-08-07 11:29) [2]
> Подскажите каким образом нужно плучать ответы от IdTCPServer
> в клиенте
В отдельном потоке
или
ReadLn("",5) (таймаут 5 мс - практически не тормозит...)
или
точнее даже "и"
кинь на форму компонент IdAntiFreeze
← →
test (2003-08-07 12:58) [3]Если Вас не затруднит, примерчик пожалйста.
← →
Reindeer Moss Smoker (ex-RME) (2003-08-07 13:07) [4]Начало примера
MyString:=IdTCPClient.ReadLn
Конец примера
← →
test (2003-08-07 13:22) [5]Reindeer Moss Smoker (ex-RME)
MyString := IdTCPClient.ReadLn - не, у это понятно. Я не про то спрашивал. Вот у старого клиента была такая фишка, как OnClientRead, а в инди на клиенте такого нет. Приходится извращаться. На событии OnConnect - срабатывает всего раз, если по таймеру, то срабатывает как надо, только виснет. Вот чего я спрашивал. Может есть какой вариант, аналогично старому.
← →
Reindeer Moss Smoker (ex-RME) (2003-08-07 13:25) [6]"Старый" клиент имел асинхронные методы, "новый" имеет синхронные.
← →
Reindeer Moss Smoker (ex-RME) (2003-08-07 13:26) [7]Ты сам себе можешь объяснить зачем тебе потребовался таймер?
← →
test (2003-08-07 13:46) [8]Reindeer Moss Smoker (ex-RME)
Объясняю популярно. Мне нужно получать сообщения от серверной части. Если пользоваться событием OnConnect то получение данных происходит 1 раз, потом все пакеты идуд по извесному адресу (на ...) :( Почему - непонятно. Если ставить получение пакетов по циклу, прога подвисает. Ставить по таймеру, работает чуть дольше, но результат тотже. Если рассмотреть чат, из демо в инди, то можно увидеть, что там используется в качестве цикла на прием данных - таймер. Геморой полный! Для тех, кто не понял мою мысль, привожу ее в другой интерпретации:
В серверной части чтение пакетов происходит по событию OnExecute.
Все работает как надо.
procedure tform1.idtcpserveronexecute;
Begin
With iIdTCPServer Do
Begin
IdTCPServer.ReadLn ("xxx");
// ...
End;
End;
Теперь к клиенту. У него нет никакого события, которое бы постоянно принимало от сервера пакеты. В старом было OnClientRead, в нди нет. По этому нужно ставить цикл. Вариант
With IdTCPClient Do
Begin
ReadStr := IdTCPClient.ReadLn;
End;
не проходит. :( Что делать?
← →
Reindeer Moss Eater (2003-08-07 13:50) [9]Тебе что, просто свой код некуда вставить кроме как в обработчики событий?
Теперь к клиенту. У него нет никакого события, ...
Нет события, потому что оно ему не надо. Серверу надо потому что он многопоточный и обслуживает многих клиентов.
Клиенту это не нужно. Клиент - он один.
Достаточно вызвать метод и получить от сервера данные.
Нужны еще данные, вызови метод еще раз.
← →
test (2003-08-07 13:54) [10]Reindeer Moss Eater
Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(
← →
Reindeer Moss Eater (2003-08-07 14:02) [11]Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(
Соединившись с сервером, клиент должен читать. Прочитав, должен читать снова.
← →
Reindeer Moss Eater (2003-08-07 14:04) [12]Вопрос: Откуда клиент узнает, что ему прислали пакет?
Как только произойдет возврат из метода чтения, так значит "Вам пакет"
← →
test (2003-08-07 14:07) [13]Reindeer Moss Eater
Слушай, дорогой! Ты меня совсем не понимаешь. То, что ты сказал, это ясно и так. Меня интересует вопрос, как это оформить програмно. Ну -
procedure TForm1.TimerOnTimer;
Begin
Client.ReadLn;
End; - только такой вариант не подходит, виснет. Где ставить цикл или ... ?
← →
Reindeer Moss Eater (2003-08-07 14:17) [14]Дорогой, не нужен таймер.
Пойми сначало это. Потом продолжим.
← →
test (2003-08-07 14:27) [15]Reindeer Moss Eater
Если тебе не трудно, напиши маленький примерчик, в котором будет показана работа клиента с пакетами.
← →
Reindeer Moss Eater (2003-08-07 14:31) [16]procedure WorkWithServer;
var cStr:string;
begin
while True do
begin
cStr:=IdTCPClient.ReadLn;
if cStr = "go to bed" then Break
else if cStr = "Делай то" then ExeDelayToTo
else if cStr = "Делай cё" then ExeDelaySe
else ExeDoSomethind;
end;
end;
← →
Tiny (2003-08-07 14:39) [17]
> Reindeer Moss Eater © (07.08.03 14:31)
Ну какая разница - пусть в таймере сделает...
Но лучше - отдельный поток
← →
$hade (2003-08-07 14:40) [18]Тьфу! Второй раз такая фигня :-)
Выше я был...
← →
Reindeer Moss Eater (2003-08-07 14:44) [19]Ну какая разница - пусть в таймере сделает...
До меня никак не может дойти смысл применения таймера для вызова синхронных методов. Красота и элегантность этой инженерной мысли никака не постигается мной.
← →
$hade (2003-08-07 15:14) [20]:-))))))))))))))
Понимаешь,действительно сбивает с толку пример вроде как ОТ СОЗДАТЕЛЕЙ INDY - у них там применен таймер....
Хотя все компоненты - наследники (TelnetClinet,HTTP) используют отдельный поток для чтения...
А кстати в твоем примере прога вешатся все же будет...наверное поможет IdAntiFreeze
+
Как ты при этом представляешь себе параллелно к примеру ввод и отправку текста (чат) или другие действия (ведь прога постоянно будет заниматься поппыткой чтения) ?
← →
test (2003-08-07 15:20) [21]$hade ©
Вот, вот!!! Я ему про это уже который раз пытаюсь сказать. Не понимает и все. Нафига убрали из 7д компоненты. :( Мож кто подскажет, где можно слить старые компоненты?
← →
Reindeer Moss Eater (2003-08-07 15:26) [22]А кстати в твоем примере прога вешатся все же будет...наверное поможет IdAntiFreeze
Откуда такой скоропалительный вывод?
← →
Reindeer Moss Eater (2003-08-07 15:28) [23]Как ты при этом представляешь себе параллелно к примеру ввод и отправку текста (чат) или другие действия (ведь прога постоянно будет заниматься поппыткой чтения) ?
Откуда вообще уверенность что процедура выполняется в главном потоке приложения, откуда уверенность, что это GUI приложение?
Приведен пример работы, а не коммерческая программа с пожизненным сапортом.
← →
test (2003-08-07 15:28) [24]Reindeer Moss Eater
Вот не поленись и напиши прогу по своему примеру. Потом расскажешь, почему такие выводы люди делают. :)
← →
Reindeer Moss Eater (2003-08-07 15:30) [25]test
Вот не поленись и напиши прогу по своему примеру. Потом расскажешь, почему такие выводы люди делают. :)
Ты представляешь, приятель, написал. И не одну и не сегодня.
И выводов, таких как у тебя, пока никто из пользователей не сделал.
← →
Tiny (2003-08-07 15:32) [26]2test (07.08.03 15:20)
$hade ©
Вот, вот!!! Я ему про это уже который раз пытаюсь сказать. Не понимает и все. Нафига убрали из 7д компоненты. :( Мож кто подскажет, где можно слить старые компоненты?
гы-) а кто сказал что убрали?? их нет на палитре но они есть :)
bpl-ка лежит в папке belphi/bin...ищи и обретешь...))
2Reindeer Moss Eater © (07.08.03 15:26)
А кстати в твоем примере прога вешатся все же будет...наверное поможет IdAntiFreeze
Откуда такой скоропалительный вывод?
а откуда обратный должен быть?? indy - блок. сокеты - пока не прочитает не пойдет...
а ты сам то пробовал? именно c Indy??
← →
test (2003-08-07 15:33) [27]Reindeer Moss Eater
Да ладно тебе, чего ты так растраиваешся. Я тебе верю, что писал. Тогда дай примерчик. Вот взял я твою процедурку и куда мне ее прикрутить?
← →
Reindeer Moss Eater (2003-08-07 15:34) [28]Tiny
откуда вывод, что ПРОГА вешатся все же будет ?
← →
test (2003-08-07 15:35) [29]Tiny
Сапасибо за наводку, ща поглядим. :)
← →
$hade (2003-08-07 15:38) [30]Удалено модератором
← →
$hade (2003-08-07 15:44) [31]Reindeer Moss Eater © (07.08.03 15:34)
Tiny
откуда вывод, что ПРОГА вешатся все же будет ?
Ну не вешаться - тормозить (извини - не так выразился...)
если ты в основном потоке это сделаешь - на время работы ReadLn
ты ничего не сможешь сделать...а так как по умолчанию таймаут -1
(бесконечно) соответственно будешь ждать пока не прийдут данный или твой конец :-)) (кста - если при этом техонечко вытащить к примеру шнур из модема или сетевухи - конец прийдет быстрее :-)
← →
Reindeer Moss Eater (2003-08-07 15:47) [32]Еще раз для непонятливых. Мной был дан пример работы с сервером.
Не пример программы, а пример чтения данных с сервера.
И как бы кто не ухищрялся, (если методы синхронные) алгоритм будет примерно таким же. Хоть дергай модем, хоть роняй его об стену.
← →
test (2003-08-07 15:48) [33]Reindeer Moss Eater
Сдаеться мне, что Вы сударь, сами толком ничего не знаете. За весь разговор с Вами, я не получил ни одного конкретного отвела (примера), а только какието попытки доказать, что Вы чтото смыслите в нашей теме. По это делаю вывод, что Вы не компетентны в данном вопросе.
Всем остальным - БОЛЬШРЕ СПАСИБО за то, что не оставили мой вопрос без рассмотрения. Вы мне очень помогли.
← →
Reindeer Moss Eater (2003-08-07 15:50) [34]test
За весь разговор с Вами, я не получил ни одного конкретного отвела
Ты просто не умеешь понимать читаемое.
← →
test (2003-08-07 15:54) [35]Reindeer Moss Eater
Прочти то, с чего все началось, потом прочти то, что ты ответил.
Вывод -
1. Не умеешь понимать читаемое (это уже относится к тебе).
2. Не умеешь объяснить свою мысль.
← →
Reindeer Moss Eater (2003-08-07 15:56) [36]Да наздоровье.
Только все, что ты спрашивал, это
1. Как читать данные (тебе сказали как)
2. Куда прицепить показанный код.
← →
Reindeer Moss Eater (2003-08-07 15:59) [37]А за всем этим неявный вопрос "Как мне написать мою программу?"
← →
test (2003-08-07 16:02) [38]Reindeer Moss Eater
Ты сам догадался, или помог кто? Ясно-понятно, что так и есть. Ну какого хрена я б тогда заваривал все это, если бы я знал, как это сделать? Ты меня поражаеш своей догадливостью. Кстати! Ты так и не ответил на поставленный вопрос. :)
← →
test (2003-08-07 16:04) [39]Кстати! Скажи мне пожалуйста, куда ты эту процедуру в коде прикрутишь? На какое событие она будет вызываться?
procedure WorkWithServer;
var cStr:string;
begin
while True do
begin
cStr:=IdTCPClient.ReadLn;
if cStr = "go to bed" then Break
else if cStr = "Делай то" then ExeDelayToTo
else if cStr = "Делай cё" then ExeDelaySe
else ExeDoSomethind;
end;
end;
← →
Reindeer Moss Eater (2003-08-07 16:05) [40]Вот взял я твою процедурку и куда мне ее прикрутить?
Этот что ли вопрос? Прикрути куда больше нравится. Мне например больше нравится pas модулю прикручивать.
Страницы: 1 2 вся ветка
Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.009 c