![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пара вопросов по Indy... [D7, WinXP]
$hade © (2002-11-21 11:43:00)Я уже когда-то задавал подобные вопросы...но...пока так и не разобрался....:((
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"а :-)
vor (2003-01-15 14:45:00) [1]не подскажите где скачать компоненты Indy в частности для работы с почтой пишите vorobev2002@mail.ru
$hade (2002-11-22 05:46:00) [2]Тока вот на второй вопрос вооще ничего не ответил никто - что такое IOHandlers??
$hade (2002-11-22 05:45:00) [3]лана...согласен...я ошибался....(не совсем, правда)...
а вообще - вопрос был не об этом совершенно...
но проблема уже решена...ни за что не догадаешся как!!! :-)
просто по умолчанию в D не прописан путь к исходникам Indy - то есть она использует DCU...вот толи их криво билдили...то ли какой-то старый билд...не знаю - прописал путь - перебилдил проект и все - OnExecute на сервере вызывается только если клиент что-то написал...то есть то что и должно быть...
$hade (2002-11-21 16:01:00) [4]ок....не проверил еще....но ежел что -извеняюсь....тока я не об этом все таки...какая в принципе разница что использовать...я не думаю что что-то изменится....седня проверю...завтра продолжим...)
Reindeer Moss Eater (2002-11-21 15:53:00) [5]Вот элементарный пример
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;
Reindeer Moss Eater (2002-11-21 15:49:00) [6]то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...
Это не так
$hade (2002-11-21 15:32:00) [7]ну вообще то когда работает таймер я могу чего либо делать...
то есть могут обрабатываться OnButtonClick , OnCreate,OnClose...да хоть что....хоть еще 5 таймеров одновременно...а вот как 5 циклов запустить например?
можно использовать ProcessMessage...тока толку...не ставить же его послекаждого оператора в цикле....+ все равно не сможешь обработать нажатие на кнопку...то есть пока цикл не закончился...ничего не сможещь делать...хотя и не будет висеть...
Reindeer Moss Eater (2002-11-21 15:20:00) [8]блин...для чего я пример кинул?? :-)
Тогда скажи мне, зачем таймер, если периодичность его срабатывания не имеет ничего общего с его Interval?
$hade (2002-11-21 15:16:00) [9]блин...для чего я пример кинул?? :-)
1.AntiZreeze
2.Timer отключается в начале....в конце включается....
Reindeer Moss Eater (2002-11-21 15:06:00) [10]Ну и так далее.....
Reindeer Moss Eater (2002-11-21 15:05:00) [11]и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??
Тикнул таймер, вызвал обработчик. В обработчике вызвался синхронный метод. С сервера ничего не приходит, и таймер успевает тикнуть еще раз. Вызывается обработчик в котором вызывается синхронный метод.
Reindeer Moss Eater (2002-11-21 14:56:00) [12]помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...
TidAntiFreeze
$hade (2002-11-21 14:49:00) [13]>Про циклы в паскале слышал?
Вау!! А че ета?? :-((
помимо приема данных надо еще иметь возможность по кнопочкам давить (как минимум)...представь себе асю в которой все крутичтя в цикле - нажал на кнопку - и ждеш когда у тебя уйдут 10 предидущих сообщений, скачается 15 баннеров и т.д. и только потом откроется окощко в настройками, да? :-)
(по крайней мере Я не умею выходить из цикла "на минуточу" - открыть окошко для записи сообщения по просьбе юзера - а потом вернуться обратно... )
и чем в принципе отличается применение цикла и таймера вот в конкретном моем примере ??
Reindeer Moss Eater (2002-11-21 14:42:00) [14]Кто у тебя начинает сеас обмена данными?
Reindeer Moss Eater (2002-11-21 14:40:00) [15]блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 1 - 10 сек) получать данные...
Про циклы в паскале слышал?
$hade (2002-11-21 14:36:00) [16]>Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект
блин....ну вызвал я один раз...пришло....а потом?? мне же надо периодически (раз в 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:13:00) [17]Конкретно обработчике OnExecute у сервера:
Если обработчик вызван, значит есть данные от клиента
Reindeer Moss Eater (2002-11-21 14:05:00) [18]потому что нет события OnRead или OnWrite...
И что? Нет событий, а методы-то все на месте!
а как мне тогда узнать что от сервера вообще что то пришло??
В Indy методы синхронные. Надо вызвать метод, читающий данные. Возврата из него не будет пока не придут все данные, либо таймаут, либо дисконнект
я имел ввиду как раз - написал клиент или пытается читать?
Это не проблемы сервера. Он должен читать и писать. А что делает клиент - не его забота
$hade (2002-11-21 13:04:00) [19]>А зачем клиенту что-то читать в OnTimer?
потому что нет события OnRead или OnWrite...
а как мне тогда узнать что от сервера вообще что то пришло??
мне нужно реагировать на сообщения от сервера...(не обязательно сервер ответить на мой запрос - он может и сам пакет послать...)
>Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными
я имел ввиду как раз - написал клиент или пытается читать?
Reindeer Moss Eater (2002-11-21 12:46:00) [20]А КАК МНЕ ПОНЯТЬ НА СЕРВЕРЕ - ЧТО МНЕ С КЛИЕНТОМ ДЕЛАТЬ??
Прочитать что пишет клиент и решить что с ним делать на основе соглашений собственного протокола обмена данными