Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глупый вопрос по TTCPClient [D7, Win2k]


Страницы:   1 2

alt7 ©   (2003-10-21 14:26:00) 

Не могу понять вот какой вещи.

С помощью данного компонента коннекчусь к серверу, прохожу авторизацию и подписываюсь на определенные порции данных, пользуюсь методами ReceiveLn, SendLn, SendBuf. Это все в отдельной процедуре.

Затем эти данные ничанают сыпаться моему клиенту, НО обработчик TTCPClient.OnReceive не срабатывает, когда они приходят, почему?

Обходной путь, сделал таймер который срабатывает 10 раз в секунду, а в нем вызываю ReceiveLn для компонента, но это грузит процессор на все 100% и не подходит мне.

Главные вопросы: почему не срабатывает событие OnReceive, и что сделать, чтобы срабатывало без вышеупомянутого таймера?


Erik   (2003-10-22 15:00:00) [1]

Блин ну и бодягу вы здесь развели.
alt7
Ты что такое TThread знаеш? Надеюсь, что знаеш вот его и используй. В нем читай в цикле приходящей буфер хотябы на 20 байт или сколько у тебя обычно приходит. Пока непрочитаеш висиш на этой строчке, после опять на нео поподеш. В томже цикле уведоми основной поток, что данные пришли!
Лично я если надо было, чтото просто сделать использовал Indy. Там есть твои любимае события, только используй UDP а то будеш спрашивать как приходящие данные склеивать. И посылай пакетами.


Rouse_   (2003-10-22 14:59:00) [2]

В OnReceive

Желаю успехов

ЗЫ: Так последний совет всеже помог?


alt7   (2003-10-22 14:40:00) [3]

Сделал, работаем без таймера...
Но тут беда видимо попроще ;))

Загрузка проца в норме, 1-3%...

На форме у меня TMemo и я вижу по нему, что данные приходят.. вот только не могу за заголовок подвигать к примеру..

Кажется Application.ProcessMessages надо куда-то положить, вопрос куда? Чтобы я мог нормально подвигать, или закрыть приложение...


Rouse_   (2003-10-22 14:04:00) [4]

Если срабатывает самое первое OnReceive то можно в конце приема сделать Receiveln; По идее должно по приходу данных опять отработать OnReceive. Это чтобы небыло зависимости от таймера.


alt7   (2003-10-22 14:01:00) [5]

Сомневаюсь. Обоснования:

Если я включаю таймер - логинюсь, подписываюсь на данные, даю команду STAR - сервер начинает передавать мне данные. OnReceive работает, вообщем если бы только не было загрузки проца на 100% - все было бы прекрасно.

Таймер выключаю - все, OnReceive не работает.

То есть, мои команды в порядке, отсылаю я их правильно, и сервер получает их правильно. Проблема на стороне клиента, а не сервера.
Клиент в BlockingMode. Насчет лога, сделаю сейчас - посмотрю, но очень сомневаюсь...

Спасибо..


Rouse_   (2003-10-22 13:56:00) [6]

Хм, у меня почемуто есть уверенность что вы отправляете всеже не то что вы думаете... Попробуйте писать в лог все данные которые отправлены и смотреть. Т.е. ушла строка в сеть, этуже строку без искажений в файл. Ушол элемент из буфера егоже в файл. И желательно сравнить как они приходят данные на сервер. Может быть еще проблема с асинхронностью.

Короче много вариантов. Вечером если не забуду постараюсь кинуть код.


alt7   (2003-10-22 13:50:00) [7]

Что-то вопроса я не понял...
То что я отсылаю серверу, то к ниму и приходит, а как же иначе?

Ничего ж не меняется все мои команды работают прекрасно.


Rouse_   (2003-10-22 13:41:00) [8]

А есть возможность узнать и сравнить какие данные отсылаются и приходят к нему?


alt7   (2003-10-22 13:37:00) [9]

Telnet


Rouse_   (2003-10-22 13:35:00) [10]

Я имею ввиду FTP, SMTP, POP3?


alt7   (2003-10-22 13:33:00) [11]

К сожалению не могу сказать IP-шник, коммерческая тайна ;))
Серьезно.


Rouse_   (2003-10-22 13:33:00) [12]

Что за сервер?


alt7   (2003-10-22 12:44:00) [13]

Так не работает, я даже авторизацию не могу пройти, вместо #13#10 я везде писал SendLN, и с ним работало


Rouse_   (2003-10-22 12:22:00) [14]

А смысл в RFC. Это стандарт. Ты вначале попробуй, а потом скажешь, получилось или нет.

Желаю успехов


alt7   (2003-10-22 12:17:00) [15]

А смысл?

Ведь авторизацию я прохожу, подписываюсь, на все это сервер отвечает ОК.

Если я включаю свой таймер, то данные принимаются, и я в OnReceive могу их обработать.

В OnTimer пишу Form_CTD.TTCPCClient.ReceiveLn;

А вот без этого постоянного срабатывания OnTimer, то бишь без постоянного ReceiveLn, OnReceive не срабатывает, и я не могу обработать поступающие данные.


Rouse_   (2003-10-22 12:09:00) [16]

Точнее я не правильно выразился.
К примеру ты коннектишся на РОР3-сервер.
Ты должен посылать в конце каждой комманды #13#10. (Т.е. буффер который ты посылаешь должен завершаться этими двумя кодами - перевод строки и возврат каретки)
К примеру:
user Rouse#13#10
+ OK
pass MyPassword#13#10
+ OK
stat#13#10
после этой комманды тебе и пойдет ответ

Желаю успехов

ЗЫ: Если я правильно понял о чем речь


Rouse_   (2003-10-22 12:01:00) [17]

Ааа, так сервер не твой? Если так то попробуй для начала приема данных посылать #13#10.

Желаю успехов


alt7   (2003-10-22 11:34:00) [18]

По пунктам:

1) Кода нет, потому как я не знаю куда его пихать, про это я уже много выше говорил, про OnReceive, таймер и иже с ними.

2) Приходится так, потому что сервер почему-то говорит BAD, а не OK, если весь буфер отсылать (сервер не наш).

3) Это просто перенесенный кусок из старого приложения, окончательную доводку и гм, оптимизацию кода еще рано делать.

Тут вот еще вопрос возник. Клиент работает в блокирующем режиме, сервер - не знаю в каком. Возможно ли, что если поставить клиенту асинхронный, то станет срабатывать событие OnReceive. Если я счас бред сказал, не пинайте - просто скажите ;))


Rouse_   (2003-10-22 09:31:00) [19]

Вопервых не вижу код который отвечает за прием данных от сервера, когда он начинает "Сыпать данными". Скорее ошибка в нем...

Второе, не буду ничего говорить про стиль написания, но вот этот момент мне не понятен:
for zz := 1 to Length(REQU) do
begin
SendChar := REQU[zz];
Form_CTD.TCPCClient.SendBuf(SendChar,1,0);
end;


А почему не весь буфер сразу отсылать?

Ну и еще:
> if (Pos("OK",Buffer) <> 0) and (Length(Buffer) = 2) then
Не кажется что будет проще: if Buffer = "OK" then ...

Желаю успехов


alt7   (2003-10-21 18:09:00) [20]

Видать завуалированный исходник ;))

У меня ведь все же вопрос более теоритический ;))

Если мне надо постоянно вызывать WaitForData или ReceiveLn, то с использованием таймера, грузим проц на 100%. Как это обойти?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо