Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.06;
Скачать: CL | DM;

Вниз

Пара вопросов по Indy...   Найти похожие ветки 

 
$hade ©   (2002-11-21 11:43) [0]

Я уже когда-то задавал подобные вопросы...но...пока так и не разобрался....:((

1. В TIdTCPServer есть событие OnExecute - типа когда клиент запустил новый поток...
В этом событии можно читать данные от клиента когда тот их ПОСЫЛАЕТ.
На клиенте такого события нет - приходится читать в таймере...
Вот два примера кода:
1. Клиент
OnButton1Click
Client.SendBuffer(buf,sizeof(Buf));

OnButton2Click
Client.ReciveBuffer(buf,sizeof(Buf));

Сервер
OnExecute(AThread:TIDThread);
AThread.Connection.ReciveBuffer(Buf,sizeof(buf));
...
AThread.Connection.SendBuffer(Buf,sizeof(buf));

!! Это не конкретный код - просто пример...
так все работает...

2. 1. Клиент
OnButton1Click
Client.SendBuffer(buf,sizeof(Buf));

!! OnTimer !!
Client.ReciveBuffer(buf,sizeof(Buf));

Сервер
OnExecute(AThread:TIDThread);
AThread.Connection.ReciveBuffer(Buf,sizeof(buf));
...
AThread.Connection.SendBuffer(Buf,sizeof(buf));

А тут ж...sorry...вощщем на сервере событие OnExecute происходит уже и когда клиент читает,и когда пишет...
А КАК МНЕ ПОНЯТЬ НА СЕРВЕРЕ - ЧТО МНЕ С КЛИЕНТОМ ДЕЛАТЬ??

И еще маленький вопрос - кто разбирался c Indy в D7 (или с последними версиями вообще) - что за звери такие - I/O Handlers?
(типа - нет,все понятно - но что конкретно? :-))

P.S:В числе других особенно хотелось бы услышать мнение Digitman"а :-)


 
Reindeer Moss Eater   (2002-11-21 12:44) [1]

На клиенте такого события нет - приходится читать в таймере...
А зачем клиенту что-то читать в OnTimer?


 
Reindeer Moss Eater   (2002-11-21 12:46) [2]

А КАК МНЕ ПОНЯТЬ НА СЕРВЕРЕ - ЧТО МНЕ С КЛИЕНТОМ ДЕЛАТЬ??
Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными


 
$hade ©   (2002-11-21 13:04) [3]

>А зачем клиенту что-то читать в OnTimer?
потому что нет события OnRead или OnWrite...
а как мне тогда узнать что от сервера вообще что то пришло??
мне нужно реагировать на сообщения от сервера...(не обязательно сервер ответить на мой запрос - он может и сам пакет послать...)


>Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными
я имел ввиду как раз - написал клиент или пытается читать?


 
Reindeer Moss Eater   (2002-11-21 14:05) [4]

потому что нет события OnRead или OnWrite...
И что? Нет событий, а методы-то все на месте!

а как мне тогда узнать что от сервера вообще что то пришло??
В Indy методы синхронные. Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект

я имел ввиду как раз - написал клиент или пытается читать?
Это не проблемы сервера. Он должен читать и писать. А что делает клиент - не его забота


 
Reindeer Moss Eater   (2002-11-21 14:13) [5]

Конкретно обработчике OnExecute у сервера:
Если обработчик вызван, значит есть данные от клиента


 
$hade ©   (2002-11-21 14:36) [6]

>Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект

блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 1 - 10 сек) получать данные...

>Это не проблемы сервера. Он должен читать и писать. А что делает клиент - не его забота
???? То есть как не его забота - писать читать и вормировать пакеты он ведь должен на основе данных полученных от клиента???

>Конкретно обработчике OnExecute у сервера:
Если обработчик вызван, значит есть данные от клиента
а нифига!! если я отсылаю клиентом - все так и есть...
если принимаю клиентом (по кнопке или 1 раз в коде - работает)...как только я засовываю процедуру приема в timer или Thread - OnExecute происходит даже когда клиент пытается прочитать....


вот примерный код процедуры OnTimer:
if not FConnected then exit;
Timer.Enabled := false;
try
if isHdr then
begin
Socket.ReadBuffer(PacketHeader,PacketHeaderSize);
if PacketHeader.Header <> pvCurrent then
begin
Socket.Disconnect;
exit;
end;
PacketType := GetPacketType(PacketHeader);
if PacketType = ptDisconnect then
Socket.Disconnect;
if GetDataSize(PacketHeader) = 0 then
begin
while DataStreamLocked do
AntiFreeze.Process;
DataStreamLocked := true;
FDataStream.Write(PacketHeader, PacketHeaderSize);
DataStreamLocked := false;
isHDR := true;
end
else
isHDR := false;
end;

if (not IsHDR) and FConnected then
begin
DataSize := GetDataSize(PacketHeader);
if DataSize <> 0 then
begin
while DataStreamLocked do
AntiFreeze.Process;
DataStreamLocked := true;
FDataStream.Write(PacketHeader, PacketHeaderSize);
Socket.ReadStream(FDataStream, DataSize);
//или ReadBuffer - неважно...
DataStreamLocked := false;
isHDR := true;
end; //Data<>0
end;
except

// например таймаут...
end;
DataStreamLocked := false;
Timer.Enabled := FConnected;

{прошу не прикапываться к коду по мелочам...просто методом тыка пытался решать вышеопиванную проблему...}

P.S: Вообще - используется протокол - оччень похожий на ICQ v7...


 
Reindeer Moss Eater   (2002-11-21 14:40) [7]

блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 1 - 10 сек) получать данные...
Про циклы в паскале слышал?


 
Reindeer Moss Eater   (2002-11-21 14:42) [8]

Кто у тебя начинает сеас обмена данными?


 
$hade ©   (2002-11-21 14:49) [9]

>Про циклы в паскале слышал?
Вау!! А че ета?? :-((

помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...представь себе асю в которой все крутичтя в цикле - нажал на кнопку - и ждеш когда у тебя уйдут 10 предидущих сообщений, скачается 15 баннеров и т.д. и только потом откроется окощко в настройками, да? :-)
(по крайней мере Я не умею выходить из цикла "на минуточу" - открыть окошко для записи сообщения по просьбе юзера - а потом вернуться обратно... )
и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??


 
Reindeer Moss Eater   (2002-11-21 14:56) [10]

помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...
TidAntiFreeze


 
Reindeer Moss Eater   (2002-11-21 15:05) [11]

и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??
Тикнул таймер, вызвал обработчик. В обработчике вызвался синхронный метод. С сервера ничего не приходит, и таймер успевает тикнуть еще раз. Вызывается обработчик в котором вызывается синхронный метод.


 
Reindeer Moss Eater   (2002-11-21 15:06) [12]

Ну и так далее.....


 
$hade ©   (2002-11-21 15:16) [13]

блин...для чего я пример кинул?? :-)
1.AntiZreeze
2.Timer отключается в начале....в конце включается....


 
Reindeer Moss Eater   (2002-11-21 15:20) [14]

блин...для чего я пример кинул?? :-)
Тогда скажи мне, зачем таймер, если периодичность его срабатывания не имеет ничего общего с его Interval?


 
$hade ©   (2002-11-21 15:32) [15]

ну вообще то когда работает таймер я могу чего либо делать...
то есть могут обрабатываться OnButtonClick , OnCreate,OnClose...да хоть что....хоть еще 5 таймеров одновременно...а вот как 5 циклов запустить например?
можно использовать ProcessMessage...тока толку...не ставить же его послекаждого оператора в цикле....+ все равно не сможешь обработать нажатие на кнопку...то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...


 
Reindeer Moss Eater   (2002-11-21 15:49) [16]

то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...

Это не так


 
Reindeer Moss Eater   (2002-11-21 15:53) [17]

Вот элементарный пример

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
while ATrue do
begin
Sleep(100);
Application.ProcessMessages;
Caption:="In Cycle";
end;
Caption:="Out Of Cycle";
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
ATrue :=False;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
ShowMessage("Это сделано пока где-то крутится цикл");
end;


 
$hade ©   (2002-11-21 16:01) [18]

ок....не проверил еще....но ежел что -извеняюсь....тока я не об этом все таки...какая в принципе разница что использовать...я не думаю что что-то изменится....седня проверю...завтра продолжим...)


 
$hade ©   (2002-11-22 05:45) [19]

лана...согласен...я ошибался....(не совсем, правда)...
а вообще - вопрос был не об этом совершенно...

но проблема уже решена...ни за что не догадаешся как!!! :-)

просто по умолчанию в D не прописан путь к исходникам Indy - то есть она использует DCU...вот толи их криво билдили...то ли какой-то старый билд...не знаю - прописал путь - перебилдил проект и все - OnExecute на сервере вызывается только если клиент что-то написал...то есть то что и должно быть...


 
$hade ©   (2002-11-22 05:46) [20]

Тока вот на второй вопрос вооще ничего не ответил никто - что такое IOHandlers??


 
vor   (2003-01-15 14:45) [21]

не подскажите где скачать компоненты Indy в частности для работы с почтой пишите vorobev2002@mail.ru



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

Текущий архив: 2003.03.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
14-17308
глупый
2003-02-17 13:50
2003.03.06
Fidonet


1-17039
MikeFW
2003-02-25 09:27
2003.03.06
Как на чужой exe-шник навесить свой пароль?


3-16969
fool
2003-02-17 12:15
2003.03.06
Временные файлы, как избавиться: PARADOX.LNK, PDOXUSRS.LCK


1-17100
UDS
2003-02-25 18:34
2003.03.06
Как задать массив, если первоначально его длина неизвестна?


14-17378
ProtoSoft
2003-02-18 00:31
2003.03.06
Привет! Ребята, подскажите пожалуйста алгоритм поиска наиме..