Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Вниз

Tidtcpclient и пример из Indy   Найти похожие ветки 

 
Hereticsoul ©   (2005-05-18 16:25) [0]

Здраствуйте.
Вообщем необходимо написать локальный чат, решил попробовать построить на компонентах Indy.Скачал пример чата с их сайта, но так и не понял как это должно работать...потому что в клиентской часть приложения висит таймер 500 м/с и выполняет следующее :

[code] var
 Com,
 Msg : String;
begin
 if not IdTcpClient1.Connected then
   exit;

 Msg := IdTCPClient1.ReadLn("", 5);

 if Msg <> "" then
   if Msg[1] <> "@" then
     begin
     { Not a system command }
       memLines.Lines.Add(Msg);
     end
   else
     begin
     { System command }
       Com := UpperCase(Trim(Copy(Msg, 2, Pos(":", Msg) -2)));
       Msg := UpperCase(Trim(Copy(Msg, Pos(":", Msg) +1, Length(Msg))));
       if Com = "CLIENTS" then
         lbClients.Items.CommaText := Msg;
     end;[/code]

отсюда видно что сам IdTcpClient1 постоянно(раз в 500м/с) пытается читать что ему там прислале....все прекрасно если бы не одно но весь интерфейс просто зависайт....и вся программа "отдается" и зависает пока что либо не пришлют.....но этож не дело...в связи с тем и вопрос как узнать что что-то прислали на IdTcpClient1 ???


 
Hereticsoul ©   (2005-05-18 16:26) [1]

Простите за очепятки....конец рабочего дня все-таки )))


 
Digitman ©   (2005-05-18 16:57) [2]


> потому что в клиентской часть приложения висит таймер 500
> м/с и выполняет следующее


что-то слабо верится, что разработчики Indy могли такую глупость сморозить - использовать таймер для оной цели


> отсюда видно что сам IdTcpClient1 постоянно(раз в 500м/с)


ничего отсюда не видно .. в твоем коде нет нигде упоминания о "500"

это что, обработчик OnTimer у тебя или что ?


 
Hereticsoul ©   (2005-05-19 09:30) [3]


> что-то слабо верится, что разработчики Indy могли такую
> глупость сморозить - использовать таймер для оной цели


прежде чем верить или нет по логике вещей можно просто посмотреть:

http://www.projectindy.org/DemoDownloads/Indy9Demos_26Oct04.zip
(1,3 мб)


> ничего отсюда не видно .. в твоем коде нет нигде упоминания
> о "500"
>
> это что, обработчик OnTimer у тебя или что ?


простите,ну не видно зато сказано...да это обработчик OnTimer...

А что делать - это вопрос!

в принципе это лечиться если положить на форму TidAntiFreeze...но это не дело потому что все подлагивает.
тут я вижу решение что можно отслеживать есть ли что-то что можно прочитать и если есть то читать (Msg := IdTCPClient1.ReadLn("", 5);) в противном случае выходить из обработчика OnTimer...но как реализовать не знаю (((...

Вообще у Tclientsocket есть обработчик OnDataRecieve (или как-то так)...было удобно....только вся прелесть Indy в том что бы автоматически у Tidtcpserver все connections пускать в разные потоки TidTreadMgr это очень удобно а у TServersocket это еще надо реализовывать я не против но время не резиновое к сожалению.....ну наверняка кто-то сталкивался с этой проблемой )))


 
Reindeer Moss Eater ©   (2005-05-19 09:46) [4]

тут я вижу решение что можно отслеживать есть ли что-то что можно прочитать и если есть то читать (Msg := IdTCPClient1.ReadLn("", 5);) в противном случае выходить из обработчика OnTimer...но как реализовать не знаю (((...

Ничего не надо отслеживать.
Возврат из ReadLn происходит либо когда прочитана строка, либо наступил таймаут  (второй параметр)
Выход из обрабочика там уже реализован
if Msg <> "" then ...


 
Hereticsoul ©   (2005-05-19 09:51) [5]

Ничего не надо отслеживать.
Возврат из ReadLn происходит либо когда прочитана строка, либо наступил таймаут  (второй параметр)
Выход из обрабочика там уже реализован
if Msg <> "" then ...

Я вижу...но как факт программа-то висит в смысле по таймауту в
5 м/с (IdTCPClient1.ReadLn("", 5);) работа не прекращается...


 
Reindeer Moss Eater ©   (2005-05-19 09:59) [6]

Значит твоя версия инди с глюком реализации таймаута чтения


 
Hereticsoul ©   (2005-05-19 10:08) [7]

V 9.00.10


 
Digitman ©   (2005-05-19 10:09) [8]


> а у TServersocket это еще надо реализовывать


все там уже реализовано в этом плане


> в принципе это лечиться если положить на форму TidAntiFreeze...но
> это не дело потому что все подлагивает.


антифриз этот в конечном итоге периодически вызывает Application.ProcessMessages (или его аналог, не помню)

либо ты возлагаешь эту заботу на антифриз либо по истечению очередного ожидания таймаута в 5 мс сам делаешь тоже самое ... третьего не дано ..

а таймер - вот это точно "не дело"


 
Reindeer Moss Eater ©   (2005-05-19 10:14) [9]

Вообще у Tclientsocket есть обработчик OnDataRecieve (или как-то так)...было удобно....

Ну дык и используй его в клиенте.


 
Hereticsoul ©   (2005-05-19 10:41) [10]

2Reindeer Moss Eater
Млин а ты прав...протокол -то один...ведь клиент не обязательно должен быть "от" Indy ...спасибо.



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

Форум: "Сети";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
14-1123943420
root
2005-08-13 18:30
2005.09.04
Игры для мобильников.


14-1123886353
Германн
2005-08-13 02:39
2005.09.04
Необходимость использования баз данных в программе


11-1106564069
Sphinxx
2005-01-24 13:54
2005.09.04
Вопрос о TKOLEcmListEdit


14-1123090305
Посетитель
2005-08-03 21:31
2005.09.04
Начинаю новую жизнь


3-1121958144
Prohodil Mimo
2005-07-21 19:02
2005.09.04
клонирование записей из 3х связанных таблиц





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский