![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите непонятливому!!!! Indy IdTCPClient -
tes © (2003-08-06 18:29:00)
Помню раньше были компоненты TServerSocket TClientSocket, у клиента была такая тема как - ClientSocketRead, в Indy такого нет. Если ставить на таймер IdTCPClient.ReadLn то прога быстро уходит в мир иной (полное вислово) :( Подскажите каким образом нужно плучать ответы от IdTCPServer в клиенте. Задолбался уже.
Reindeer Moss Eater (2003-08-07 14:44:00) [61]
Ну какая разница - пусть в таймере сделает...
До меня никак не может дойти смысл применения таймера для вызова синхронных методов. Красота и элегантность этой инженерной мысли никака не постигается мной.
$hade (2003-08-07 14:40:00) [62]
Тьфу! Второй раз такая фигня :-)
Выше я был...
Tiny (2003-08-07 14:39:00) [63]
> Reindeer Moss Eater © (07.08.03 14:31)
Ну какая разница - пусть в таймере сделает...
Но лучше - отдельный поток
Reindeer Moss Eater (2003-08-07 14:31:00) [64]
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;
test (2003-08-07 14:27:00) [65]
Reindeer Moss Eater
Если тебе не трудно, напиши маленький примерчик, в котором будет показана работа клиента с пакетами.
Reindeer Moss Eater (2003-08-07 14:17:00) [66]
Дорогой, не нужен таймер.
Пойми сначало это. Потом продолжим.
test (2003-08-07 14:07:00) [67]
Reindeer Moss Eater
Слушай, дорогой! Ты меня совсем не понимаешь. То, что ты сказал, это ясно и так. Меня интересует вопрос, как это оформить програмно. Ну -
procedure TForm1.TimerOnTimer;
Begin
Client.ReadLn;
End; - только такой вариант не подходит, виснет. Где ставить цикл или ... ?
Reindeer Moss Eater (2003-08-07 14:04:00) [68]
Вопрос: Откуда клиент узнает, что ему прислали пакет?
Как только произойдет возврат из метода чтения, так значит "Вам пакет"
Reindeer Moss Eater (2003-08-07 14:02:00) [69]
Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(
Соединившись с сервером, клиент должен читать. Прочитав, должен читать снова.
test (2003-08-07 13:54:00) [70]
Reindeer Moss Eater
Утомил. Сервер может посылать мне сообщения в разные промежутки времени. Вопрос: Откуда клиент узнает, что ему прислали пакет? Для этого как я понимаю, нужно ставить обработчик, который будет контролить этот процесс -> возвращаемся туда, откуда пришли. :(
Reindeer Moss Eater (2003-08-07 13:50:00) [71]
Тебе что, просто свой код некуда вставить кроме как в обработчики событий?
Теперь к клиенту. У него нет никакого события, ...
Нет события, потому что оно ему не надо. Серверу надо потому что он многопоточный и обслуживает многих клиентов.
Клиенту это не нужно. Клиент - он один.
Достаточно вызвать метод и получить от сервера данные.
Нужны еще данные, вызови метод еще раз.
test (2003-08-07 13:46:00) [72]
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 Smoker (ex-RME) (2003-08-07 13:26:00) [73]
Ты сам себе можешь объяснить зачем тебе потребовался таймер?
Reindeer Moss Smoker (ex-RME) (2003-08-07 13:25:00) [74]
"Старый" клиент имел асинхронные методы, "новый" имеет синхронные.
test (2003-08-07 13:22:00) [75]
Reindeer Moss Smoker (ex-RME)
MyString := IdTCPClient.ReadLn - не, у это понятно. Я не про то спрашивал. Вот у старого клиента была такая фишка, как OnClientRead, а в инди на клиенте такого нет. Приходится извращаться. На событии OnConnect - срабатывает всего раз, если по таймеру, то срабатывает как надо, только виснет. Вот чего я спрашивал. Может есть какой вариант, аналогично старому.
Reindeer Moss Smoker (ex-RME) (2003-08-07 13:07:00) [76]
Начало примера
MyString:=IdTCPClient.ReadLn
Конец примера
test (2003-08-07 12:58:00) [77]
Если Вас не затруднит, примерчик пожалйста.
$hade (2003-08-07 11:29:00) [78]
> Подскажите каким образом нужно плучать ответы от IdTCPServer
> в клиенте
В отдельном потоке
или
ReadLn("",5) (таймаут 5 мс - практически не тормозит...)
или
точнее даже "и"
кинь на форму компонент IdAntiFreeze
Reindeer Moss Eater (2003-08-07 08:36:00) [79]
Если ставить на таймер IdTCPClient.ReadLn
Зачем на таймер? Почему не на тормоз?
IdTCPClient.ReadLn без таймера не работает что ли?